要するに、静的ファクトリはクールで用途がありますが、一部の API は、付加価値がなく複雑さを追加するだけでも、あらゆる場所でそれらを使用するというわなに陥ります。
Java で静的ファクトリがうまく機能する例の 1 つは、オーバーロードされたコンストラクターとして自然に実装できない名前付きビルダーが多数ある EnumSet です。
たとえば、これらは同じ引数を持っていても同じことをしません。
EnumSet.of(E1, E3);
EnumSet.range(E1, E3);
また、EnumSet は、列挙型の要素数に基づいて 2 つの異なる実装を返します。
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
残念ながら、EnumMap は同様に機能しないため、実装は 1 つしかありません。
.1. 1 つには、より良い型推論が得られます。たとえば、Guava's を参照してください
したがって、グアバには次のようなメソッドがあります
List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();
Java 7ではこれはちょうど
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();
Map<KeyType, LongishValueType> map = new LinkedHashMap<>();
これは短いので、新しいメソッドを学ぶ必要はありません.Java 6では、型の二重チェックが必要ない場合は、次のことができます.
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList();
Map<KeyType, LongishValueType> map = new LinkedHashMap();
グアバでは、
Set<Type> copySet = Sets.newHashSet(elements);
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
組み込みメソッドはどこにありますか
Set<Type> copySet = new HashSet<String>(elements);
List<String> theseElements = Arrays.asList("alpha", "beta", "gamma");
HashSet からをドロップすると、<String>
型の安全性が失われますが、ほとんどの適切な IDE がこのコードをオートコンプリートすることを考えると、実際には入力を節約することはできません。
.2. クラスの設計者は、静的メソッドで返されるものを後で変更できます。
私はYAGNIと言いますが、実装を透過的に大幅に変更することは実際には非常に困難です。コードを再構築または再テストすることなく、完全な下位互換性を備えた代替品をドロップできる可能性はほとんどありません。
.3. コンストラクターの継承を処理するのは、特に何かを事前に計算する必要がある場合は苦痛です。
これは本当ですが、まれです。このような状況では、通常、複雑な構築用のビルダー クラスがあり、factor メソッドだけでは問題を解決できません。
Java ライブラリのほとんどのクラスが静的ファクトリではなくコンストラクタを使用していることを考慮する価値があります。コンストラクターが使用された場所で考えられる唯一のクラスは、後で可能であれば静的ファクトリーを使用するように変更されたのは、自動ボクシング ラッパー クラスでした。どのファクトリ メソッドを呼び出すかを知ることの複雑さは、言語によって隠されています。
Javaの現在の機能を考えると、コンストラクターを公開する理由はないようです...これまで. フレンドリー、プライベート、プロテクトはOKですが、パブリックはダメです。
何かができるからといって、それが良い考えであるとは限りません。
たとえば、すべてのクラス、メソッド、および変数を 1 文字または 2 文字の長さにすることができます (3 文字以上の名前を使用する必要はありません。一部の人々は、これが何らかの形で優れていると信じています)。
ところで、一般的な UNIX コマンドを見れば、多くは 2 文字の長さです。;)
ほとんどの場合、オブジェクトを作成するための public static メソッドを提供することをお勧めします。
シンプルさを好み、コードを不必要に複雑にしない限り。
この慣習が布告されたり書かれたりしているのを見たことがありませんか?
私もそうではありません。おそらく、それは良い考えではないからです。私見では。
私が見逃した、おそらくスーパードライではない以外のユースケースはありますか?
あなたはそれをする正当な理由を述べていませんが、それは私にとってそれをしない十分な理由です. ;)