効率的なJAVAコード---オブジェクトの作成
3096 ワード
このトピック:オブジェクトはいつ、どのように作成されますか?
1.構造関数の代わりに静的工場法を考える
メリット:構造関数とは異なり、名前があり、名前を読みやすくすることができます. コンストラクション関数とは異なり、呼び出されるたびに新しいオブジェクトを作成する必要はありません. コンストラクション関数とは異なり、タイプのサブタイプオブジェクトを返すことができます.
欠点:クラスは、公有または保護された構造関数を含まないと継承されません.クラスを設計するとき、設計者がこのクラスをクラス化(継承)またはインスタンス化することを望んでいるかどうかは、公有または保護された構造関数と構造関数の内容を提供するかどうかで完全に制御できます.ある意味では継承の乱用を制限し,複合の使用を奨励する. スタティックファクトリメソッドは、他のスタティックメソッドと同様に、APIドキュメントにおいて特に説明されるのが一般的である.強い必要がない場合は、規範的な構造関数を使用する必要があります.
2.プライベートコンストラクション関数を使用してsingleton属性を強化する
singletonとは、本質的に一意性を有するシステムコンポーネントを表すために一般的に使用される、一度しかインスタンス化できないクラスを指す.実装方法には、コンストラクション関数をプライベートとして宣言し、クラスにアクセスするための静的メンバー(メソッド/変数)を提供する2つの方法があります.方法1:公有静的メンバーはfinalドメイン であるは、公有の静的工場法 を提供する.
1.構造関数の代わりに静的工場法を考える
メリット:
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
//
Complex complex=Complex.valueOf(1.2f,1.3f);
Complex complex1=Complex.valueOfPolar(1.2f,1.3f);
}
}
class Complex{
private final float re;
private final float im;
//
public Complex(float re, float im) {
this.re = re;
this.im = im;
}
// 1
public static Complex valueOf(float re, float im){
return new Complex(re, im);
}
// 2
public static Complex valueOfPolar(float r, float theta){
return new Complex((float)(r * Math.cos(theta)), (float)(r * Math.sin(theta)));
}
}
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
//
for (int i = 0; i < 2; i++) {
Complex complex=Complex.valueOf(1.2f,1.3f);
System.out.println(complex);
}
}
}
class Complex{
private final float re;
private final float im;
//
private static Complex COMPLEX=null;
//
public Complex(float re, float im) {
this.re = re;
this.im = im;
}
//
public static Complex valueOf(float re, float im){
if (COMPLEX==null){
COMPLEX=new Complex(re,im);
}
return COMPLEX;
}
}
欠点:
2.プライベートコンストラクション関数を使用してsingleton属性を強化する
singletonとは、本質的に一意性を有するシステムコンポーネントを表すために一般的に使用される、一度しかインスタンス化できないクラスを指す.実装方法には、コンストラクション関数をプライベートとして宣言し、クラスにアクセスするための静的メンバー(メソッド/変数)を提供する2つの方法があります.
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
//
for (int i = 0; i < 2; i++) {
Complex complex=Complex.COMPLEX;
System.out.println(complex);
}
}
}
class Complex{
//
public static final Complex COMPLEX=new Complex();
//
private Complex() {}
}
public class EffectiveJavaStudyTest {
public static void main(String[] args) {
//
for (int i = 0; i < 2; i++) {
Complex complex=Complex.getInstanse();
System.out.println(complex);
}
}
}
class Complex{
//
private static final Complex COMPLEX=new Complex();
//
private Complex() {}
//
public static Complex getInstanse(){
return COMPLEX;
}
}