3

私は現在、Java が使用される言語である CS2 コース (データ構造) に登録しており、従来のコンストラクター メソッドとファクトリ メソッドを使用したオブジェクトのインスタンス化を比較対照することに興味があります。一方は他方よりもコンピューティング エレガンスの度合いが高いですか? ファクトリ メソッドは、パラメーター化されたコンストラクターと同様の方法でパラメーターを処理しますか? 例えば:

public class Tester
{
    private String name;
    private int age;

    // Parameterized constructor  
    public Tester(String myName, int myAge)
    {
        this.name = myName;
        this.age = myAge; 
    }
} 

基本的に、同等のファクトリ メソッドをどのように作成するのか、またそれによってどのような利点が得られるのかについて、私は非常に興味があります。

ありがとう、

〜ケイトリン

4

3 に答える 3

3

ファクトリ メソッドは、必ずしもそのクラスのインスタンスではないオブジェクトへの参照を返すことができるので便利です。そのクラス、サブタイプ、さらには を返すことができnull、通常、メソッドができるように、必要な方法で自分自身を運ぶことができます。したがって、型を選択するロジックを独自のコードに移動できます。必要に応じて既存のインスタンスを返すことができ、ヒープ スペースなどを節約できます。

別の基本的な疑似例は、整数をインターンInteger.forValue()できるため、同一の不変オブジェクトが理由もなく再作成されないことです。も参照してください。Executors.newXxxThreadPool()

基本的な例:

public class Tester
{
    private String name;
    private int age;

    // Parameterized constructor  
    private Tester(String myName, int myAge)
    {
        this.name = myName;
        this.age = myAge; 
    }
    public static Tester getTester(String mn, int ag){
        if(age>0){return new Tester(mn, ag);}
        else if(age>80){return new OldPersonThatExtendsTester(mn, ag);} 
        //we'd need a public or otherwise accessible constructor above. It's a subtype!
        else {return null;} //yes, this is possible
    }
} 
于 2013-09-13T22:47:31.310 に答える
2

効果的な Java での十分な理由のある観察によると、静的ファクトリ メソッドの主な利点は次のとおりです。

  • クラスにちなんで常に名前を付ける必要があるコンストラクターとは異なり、それらには名前を付けることができます。これにより、コードが読みやすくなり、引数の型が同じなどの理由でオーバーロードされたコンストラクターが不可能になるという見苦しい状況を回避できます。このような場合、違いを示す異なる名前を持つ 2 つのファクトリ メソッドを簡単に指定できます。

  • 静的ファクトリ メソッドは、新しいインスタンスを作成する必要があるコンストラクタとは異なり、実際に何かをインスタンス化する必要はありません。したがって、静的ファクトリ メソッドは、インスタンス制御のクラス (シングルトン クラスなど) には不可欠です。

  • コンストラクターとは異なり、静的ファクトリ メソッドは、返されるオブジェクトが一致するか、戻り値の型のサブクラスである限り、任意のオブジェクトを返すことができます。これにより、インターフェースベースの型システムが有効になります。Java 1.5 の Enum フレームワークはこれを利用します。EnumSet クラスにはパブリック コンストラクターがなく、静的ファクトリのみがあります。静的ファクトリによって返される実際のオブジェクトは、列挙型のサイズによって異なります。

静的ファクトリの主な欠点は、継承用に設計されたクラスの基礎になれないことです。プライベート コンストラクターのみを提供するクラスは、サブクラス化できません。静的ファクトリ メソッドの小さな欠点は、他の静的メソッドと区別できないことです。そのため、読者が認識できるようにするために、通常は命名パターンに従います (そのようなものがマーカー アノテーションとして設計されている場合は、アノテーションを付けることができます)。静的ファクトリ メソッドの場合)。

于 2013-09-14T04:17:21.877 に答える