0

Static Factory メソッドを使用する動機は次のとおりです。

コンストラクターをファクトリー メソッドに置き換える最も明白な動機は、型コードをサブクラス化に置き換えることです。

タイプコードで作成されることが多いが、サブクラスが必要なオブジェクトがあります。正確なサブクラスは、型コードに基づいています。

ただし、コンストラクターは、要求されたオブジェクトのインスタンスのみを返すことができます。そのため、コンストラクターをファクトリ メソッドに置き換える必要があります。

誰でもこれをコードで説明できますか? そして、この型コードは何を意味するのでしょうか?

4

3 に答える 3

2

ファクトリ メソッドが裸のコンストラクタより優れている 2 つ目の利点は、既存のオブジェクトを返すことができることです。このInteger.valueOf(int)方法はこれをうまく利用しています。対照的に、new常に新しいオブジェクトを作成します。

最後に、議論を少し広げると、非静的ファクトリ メソッド (たとえば、ファクトリオブジェクトの形式) を使用すると、ポリモーフィズムを使用してさまざまなオブジェクト作成戦略を実装できます。


そして、この型コードは何を意味するのでしょうか?

これを取得したページのコンテキストでこれを読む必要があります。ページが話しているのは、さまざまな「タイプ」のものを表す単一のクラスです。(この例では、異なるタイプの従業員が 1 つのクラスで表されていEmployeeます。)「タイプ コード」は、異なるタイプを識別するクラスの属性です。

于 2012-11-22T15:15:56.653 に答える
1

その人が教師か生徒かを示すために呼び出されるフィールドを持つPersonクラスがあるとします。typeこれがタイプコードになります。

ここで、この型フィールドをオブジェクト階層に置き換えると想像してください: Personclass を 2 つのサブクラスTeacherStudent.

コンストラクターを使用すると、特定のタイプの人のみを作成できますnew Teacher()new Student()

しかし、何らかのロジックに基づいて別の種類の人を作成するメソッドが必要な場合は、次のようにできます。

public static Person newPerson() {
   // can return either a Teacher or a Student
}
于 2012-11-22T15:17:42.007 に答える
1

コンストラクターは 1 つの実装のみを返すことができますが、静的ファクトリ メソッドは任意の数の実装を返すことができ、多くの場合、参照されるクラスのサブクラスです。静的ファクトリ メソッドには名前が付けられるという利点もあるため、同じ引数に対して異なる動作を行うことができます。

たとえば、これらの 2 つのメソッドは、名前に基づいて異なる値を持つ EnumSet のサブクラス (列挙型の要素の数に基づいて) を返します (引数は同じですが)。

EnumSet<MemoryType> memoryTypes = EnumSet.noneOf(MemoryType.class);
EnumSet<MemoryType> memoryTypes2 = EnumSet.allOf(MemoryType.class);

ソースから

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum[] universe = getUniverse(elementType);
    if (universe == null)
        throw new ClassCastException(elementType + " not an enum");

    if (universe.length <= 64)
        return new RegularEnumSet<>(elementType, universe);
    else
        return new JumboEnumSet<>(elementType, universe);
}

小さな列挙セット用の実装と、大きな列挙型セット用の別の実装があることがわかります。

于 2012-11-22T15:13:36.277 に答える