Effective Java学習ノート第1条---構築関数の代わりに静的工場法を考える


静的ファクトリメソッドのメリット:
  • 構造関数には命名の制限があり,静的手法には独自の名前があり,より理解しやすい.
  • 静的ファクトリメソッドは、呼び出されるたびに新しいオブジェクトを作成する必要はありません.この方法は、同じオブジェクトを頻繁に作成するプログラムにとって、パフォーマンスを大幅に向上させることができます.クラスがsingletonであることを保証することができます.彼は非可変クラスを「2つの等しいインスタンスが存在しない」ことを保証できるようにした.
  • 静的ファクトリメソッドは、戻りタイプを選択する際により柔軟性があります.静的ファクトリメソッドを使用すると、メソッドを呼び出すときに異なるパラメータを使用して異なるインスタンスを作成したり、非公有クラスのオブジェクトを作成したりすることができます.これにより、クラスの実装の詳細がカプセル化されます.

  • 静的工場メソッドのデメリット:
  • クラスが静的ファクトリメソッドによってインスタンスを取得し、クラスのコンストラクション関数が共有されていないか保護されている場合、クラスにはサブクラス(継承されている)があり得ません.サブクラスのコンストラクション関数は、親のコンストラクション関数を最初に呼び出す必要があります.親のコンストラクション関数はprivateであるため、継承が成功したと仮定しても、では、子クラスにも親クラスのプライベートコンストラクション関数を呼び出す権限がないので、継承できません.
  • は、構造関数によってインスタンスを作成するのか、SUN社が提唱しているのか、静的ファクトリメソッドは他の静的メソッドと大きく異なりません.このように作成されたインスタンスは、この静的メソッドがインスタンスを作成することであることを誰が知っていますか.補う方法は、静的工場方法の名前にvalueOfまたはgetInstanceを使用することです.

  • まとめ:
    静的工場法と公有の構造関数にはそれぞれの用途があり、私たちは彼らのそれぞれの長所を理解し、すぐに構造関数を使うことを避けなければならない.通常、静的工場はもっと適切である.他の要因が私たちの選択に強く影響していない場合は、構造関数を簡単に選択したほうがいいです.結局、彼は言語が提供する規範です.
    // Provider framework sketch
    public abstract class Foo {
    	// Maps String key to corresponding Class object
    	private static Map implementations = null;
    
    	// Initializes implementations map the first time it's called
    	private static synchronized void initMapIfNecessary() {
    		if (implementations == null) {
    		implementations = new HashMap();
    			// Load implementation class names and keys from
    			// Properties file, translate names into Class
    			// objects using Class.forName and store mappings.
    			...
    		}
    	}
    
    	public static Foo getInstance(String key) {
    		initMapIfNecessary();
    		Class c = (Class) implementations.get(key);
    		if (c == null)
    			return new DefaultFoo();
    		try {
    			return (Foo) c.newInstance();
    		} catch (Exception e) {
    			return new DefaultFoo();
    		}
    	}
    }