5

さて、私は非常に概念的な質問があります。多くのものがファブリックのように見えますが、どこに大きな利点があるのか​​ わかりません. 例として

public class MyObject {
public MyObject() {

}
public static MyObject create() {
    return new MyObject();
}

public void doSomething(){
    // some code...
};

}

私の観点からの唯一の利点は、コードへの入札が少なくなることです。私の意見では、パフォーマンスへの影響はありません。他にメリットはありますか?

MyObject myobject = new MyObject();

また

MyObjecct myobject = MyObject.create();

ありがとう

4

6 に答える 6

5

パフォーマンスに大きな違いはないという点であなたは正しいです。このフォームを使用する理由は、主にコードの読みやすさです。

一般に、静的作成関数を使用する場合は、コンストラクターをプライベートに宣言し、ユーザーが静的関数でのみオブジェクトを作成できるようにします。

一般に、静的な create がコードに多くを追加するとは思いません。通常の日常的なオブジェクトの場合、新しいものはおそらくより明確で直接的です。

ただし、静的コンストラクターが役立つと思われる場合がいくつかあります。

  1. 大規模で複雑なオブジェクト、特に初期化に多くの複雑さを伴うオブジェクトの構築では、多くの場合、単純なコンストラクターは、構築タスクが高速で簡単であるとライブラリ ユーザーに思い込ませてしまいます。
  2. あいまいなパラメーターを持つ複数のコンストラクターがある場合は、静的関数名を使用して読みやすくすることができます。たとえば、createFromFile(String FileName) と createFromJSONEncoding(String Data) を使用できます。
  3. 新しいオブジェクトが実際に作成されるかどうかを制御したい - たとえば、これが読み取り専用のリソースである場合、すでに開いているリソースのバッファーを保持している可能性があり、ライブラリのユーザーが同じリソースを 2 回要求した場合は、単に既にそれらに与えることができますキャッシュされたコピー (新しい複製コピーを作成するのではなく)
于 2013-06-26T13:50:27.807 に答える
2

Joshua Blochは、Effective Java の第 2 章、項目 1: コンストラクターではなく静的ファクトリー メソッドを検討してください。ここにいくつかのハイライトがあります:

  • 「静的ファクトリ メソッドの利点の 1 つは、コンストラクタとは異なり、名前があることです。」int--引数を取る 2 つの異なるコンストラクターを持つことはできませんが、呼び出さcreateWithAge(int age)れた 2 つの静的ファクトリ メソッドを持つことはできます。createWithHeight(int height)
  • 「静的ファクトリ メソッドの 2 つ目の利点は、コンストラクタとは異なり、呼び出されるたびに新しいオブジェクトを作成する必要がないことです。」
  • 「静的ファクトリ メソッドの 3 つ目の利点は、コンストラクタとは異なり、戻り値の型の任意のサブタイプのオブジェクトを返すことができることです。」

ご覧のとおり、懸念事項はパフォーマンスにはほとんど関係なく (キャッシュされたインスタンスの再利用を除く)、主にオブジェクト指向設計に関係しています。

免責事項: おっと、同じ回答 (はるかによく説明されています) が別の質問に既に投稿されているのを見ました: https://stackoverflow.com/a/3169644/262683。私の悪い...

于 2013-06-26T13:52:03.993 に答える
1

この質問に対する答えはありません。

実際のところ、どちらのパターンも、特定の状況に適用可能なオブジェクトを構築する正当な方法です。

静的ファクトリ メソッドは、オブジェクト キャッシュやプールを維持するシステムなど、インスタンスの制御が非常に重要な状況では重要です。

new 演算子はその単純さに適しており、継承用に設計されたクラスにとってかなり重要です。

あなたはベストプラクティスとは何かを尋ねています。その答えは、ベスト プラクティスは目標に依存するということです。この種の質問の場合と同様に、ベスト プラクティスとは、利用可能なツールを賢く使用して、スケーラブルで保守可能なソリューションに到達することです。

この質問はクローズすることをお勧めします。

于 2013-06-26T13:48:35.960 に答える