13

私はJoshua Blochによる『Effective Java 』を読んでいますが、これまでのところ、その評判に本当に応えています。最初の項目は、コンストラクターに対する静的ファクトリ メソッドの説得力のあるケースです。古き良きコンストラクタの有効性に疑問を持ち始めたほどです:)。

本のメリット・デメリットをまとめると以下のようになります。

利点:

  1. 彼らには名前があります!
  2. 完全なインスタンス コントロール (シングルトン、パフォーマンスなど) があります。
  3. サブタイプ/インターフェースを返すことができます
  4. コンパイラは型推論を提供できます

短所:

  1. プライベート クラスはサブクラス化できません
  2. コンストラクターのようにドキュメントで目立たない

最初の欠点は、実際には良いことです(本で言及されているように)。2 つ目は、マイナーな欠点であり、今後の Java リリース (javadoc の注釈など) で簡単に解決できると思います。

最終的に、ファクトリ メソッドにはコンストラクターのほとんどすべての利点があり、さらに多くの利点があり、実際の欠点はないようです。

したがって、私の質問は基本的に 3 つの部分に分かれています。

  1. コンストラクターよりもデフォルトで常に静的ファクトリ メソッドを使用することをお勧めしますか?
  2. コンストラクターを使用することは正当化されますか?
  3. オブジェクト指向言語がファクトリに言語レベルのサポートを提供しないのはなぜですか?

注:同様の質問が 2 つあります。コンストラクタを使用する場合と、getInstance() メソッド (静的ファクトリ メソッド) を使用する場合です。オブジェクトの作成: コンストラクターまたは静的ファクトリーメソッド。ただし、答えは上記のリストを提供するか、私がすでに知っている静的ファクトリメソッドの背後にある理論的根拠を繰り返します。

4

4 に答える 4

7

静的ファクトリは、最終的にコンストラクターを呼び出す必要があります。ほとんどの機能を静的ファクトリに移動できますが、コンストラクターの使用を避けることはできません。

一方、単純なケースでは、静的ファクトリを使用せずにコンストラクターのみを使用できます。

コンストラクターは最終フィールドを設定する唯一の方法であり、IMHO は非最終フィールドよりも望ましいものです。

サブクラスでコンストラクターを使用できます。サブクラスに静的ファクトリを使用することはできません。

コンポーネントの依存関係を構築するための優れた依存関係注入フレームワークがある場合は、静的ファクトリがあまり追加されないことに気付くかもしれません。

于 2012-03-09T15:09:15.377 に答える
3

私はここで Josh Bloch にかなり強く同意しており、彼は私ができるよりもうまく説明していますが、静的ファクトリが適切でない場所がいくつかあります。

  • 依存性注入がより賢明な場合。DI システム (確かに Guice) は、コンストラクターを介して物事を注入する傾向があります。特に、DI は、コンストラクターのパラメーターが将来変更される可能性があると予想される場合に適しています。
  • 人々がサブクラスを書くことを特に意図しており、彼らが実装するためのスケルトンを提供している場合。
于 2012-03-09T19:53:47.410 に答える
3

あなたが強調した同様の質問の1つからのコメントが好きです:

(コンストラクタよりもファクトリメソッドを優先するかどうかを決定する方法について)、

「何を達成しようとしているのかを決める必要があります。人々にコンストラクターを呼び出させたくない (シングルトンまたはファクトリーを作成している) か、気にしない (上記の NumberFormat のように、呼び出し元の便宜のためにいくつかのオブジェクトを初期化しています)」

私にとって、これは、ファクトリメソッドが必要ないコンストラクターを使用することが正当化されることを意味します。ファクトリを必要としないと、コードを追跡するのが難しくなります (「ここで返される正確なサブクラスはどれですか?」)。

于 2012-03-09T15:11:02.123 に答える
0

コンストラクターは退屈です。コンストラクターを検索する場所を正確に知っており、コンストラクターのスコープを知っており、何らかの形で予測可能です。それらは、神のような仕事をするためではなく、オブジェクト自体を構築するために存在します。オブジェクトの構築とはあまり関係のない他のことをやりすぎている場合は、何か間違ったことをしていることがわかります。メソッドの名前を変更するだけでは、これを「修復」することはできません。そのため、一流の開発者がいない場合、彼らはより集中し、コードの品質を「より良く」する傾向があります。(後者の場合、私が言及した点は問題ではありません。)

退屈なもの。もっと楽しく知的な挑戦をしましょう...

記録のために:質問やその他の回答で言及されている点を無視していません。この追加の点を追加したかっただけです。

于 2012-03-09T20:18:26.303 に答える