効率的なJAVAコード---オブジェクトの作成を避ける
2291 ワード
このトピック:オブジェクトの作成を回避するには、いつ、どのようにしますか?
必要に応じて機能的に等価な新しいオブジェクトを作成するのではなく、同じオブジェクトを繰り返し使用します.通常、前者の方が適切です.再利用方式は迅速で、流行している.オブジェクトが可変である場合、オブジェクトは常に再利用できます.ただし、「オブジェクトを作成するコストは非常に高いので、できるだけオブジェクトを作成しないようにしなければならない」と勘違いしないでください.「既存のオブジェクトを再利用できる場合は、オブジェクトを作成しないでください.新しいオブジェクトを作成する場合は、既存のオブジェクトを再利用しないでください」ということです.小オブジェクトのコンストラクション関数はわずかな作業しか行わないため,小オブジェクトの作成と回収動作は安価であり,特に現代のJVM実装ではなおさらである.
次に、高価なインスタンスを作成するときに最適化する方法の例を参照します.
最適化前:
最適化後:
Calendarクラスインスタンスの作成にコストがかかるため、改良されたコードはmainでループ呼び出しする際に一度だけインスタンス化され、パフォーマンスが向上します.
まとめ:先頭に対応して、高価なインスタンスを作成し、インスタンスを再利用する必要がある場合は、オブジェクトの重複作成を避けることを優先します.
必要に応じて機能的に等価な新しいオブジェクトを作成するのではなく、同じオブジェクトを繰り返し使用します.通常、前者の方が適切です.再利用方式は迅速で、流行している.オブジェクトが可変である場合、オブジェクトは常に再利用できます.ただし、「オブジェクトを作成するコストは非常に高いので、できるだけオブジェクトを作成しないようにしなければならない」と勘違いしないでください.「既存のオブジェクトを再利用できる場合は、オブジェクトを作成しないでください.新しいオブジェクトを作成する場合は、既存のオブジェクトを再利用しないでください」ということです.小オブジェクトのコンストラクション関数はわずかな作業しか行わないため,小オブジェクトの作成と回収動作は安価であり,特に現代のJVM実装ではなおさらである.
次に、高価なインスタンスを作成するときに最適化する方法の例を参照します.
最適化前:
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
Person person=new Person(new Date());
System.out.println(person.isBabyBoomer());
}
}
}
class Person{
private final Date brithDate;
public Person(Date brithDate) {
this.brithDate = brithDate;
}
public boolean isBabyBoomer(){
Calendar calendar=Calendar.getInstance();
calendar.set(1946,Calendar.JANUARY,1,0,0,0);
Date boomStart=calendar.getTime();
calendar.set(1965,Calendar.JANUARY,1,0,0,0);
Date boomEnd=calendar.getTime();
return brithDate.compareTo(boomStart)>=0 && brithDate.compareTo(boomEnd) <0;
}
}
最適化後:
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
Person person=new Person(new Date());
System.out.println(person.isBabyBoomer());
}
}
}
class Person{
private final Date brithDate;
private static final Date BOOMSTART;
private static final Date BOOMEND;
static {
Calendar calendar=Calendar.getInstance();
calendar.set(1946,Calendar.JANUARY,1,0,0,0);
BOOMSTART=calendar.getTime();
calendar.set(1965,Calendar.JANUARY,1,0,0,0);
BOOMEND=calendar.getTime();
}
public Person(Date brithDate) {
this.brithDate = brithDate;
}
public boolean isBabyBoomer(){
return brithDate.compareTo(BOOMSTART)>=0 && brithDate.compareTo(BOOMEND) <0;
}
}
Calendarクラスインスタンスの作成にコストがかかるため、改良されたコードはmainでループ呼び出しする際に一度だけインスタンス化され、パフォーマンスが向上します.
まとめ:先頭に対応して、高価なインスタンスを作成し、インスタンスを再利用する必要がある場合は、オブジェクトの重複作成を避けることを優先します.