24

Joshua Blochの記事を読んでいて、Effective JavaItem1について質問がありStatic Factory Methodます。

引用[Bloch、p.7]

インターフェイスは静的メソッドを持つことができないため、慣例により、Typeという名前のインターフェイスの静的ファクトリメソッドは、Typesという名前のインスタンス化できないクラスに配置されます。たとえば、Javaコレクションフレームワークは、変更不可能なコレクション、同期されたコレクションなどを提供します。これらの実装のほぼすべては、インスタンス化できない1つのクラス(java.util.Collections)の静的ファクトリメソッドを介してエクスポートされます。返されるオブジェクトのクラスはすべて非公開です。

Ok。ソースコードを見ると、プライベートコンストラクターを持つjava.util.Collectionインターフェイスとjava.util.Collectionsクラス(インスタンス化できないクラス)があります。そして、インスタンス化できないクラスCollectionsには、Blochが言ったように、すべて静的メソッドがあることがわかります。しかし、ブロッホが言ったように、私は2つのクラス間の関係を見ることができません

インターフェイスは静的メソッドを持つことができないため、慣例により、Typeという名前のインターフェイスの静的ファクトリメソッドは、Typesという名前のインスタンス化できないクラスに配置されます。

  1. 誰かが私に明白なことを指摘できますか?

  2. 彼が言ったときそれはどういう意味ですか

返されるオブジェクトのクラスはすべて非公開です

ここでJavaソースを入手します:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java ?av = f

4

6 に答える 6

29
  1. インターフェイスは静的メソッドを持つことができないため、慣例により、Typeという名前のインターフェイスの静的ファクトリメソッドは、Typesという名前のインスタンス化できないクラスに配置されます

    ポイントは、「Type[s]」の複数形「s」だけです。したがって、インターフェイスが呼び出されFoo、呼び出される実装を作成する場合MyFooは、インスタンス化するメソッドを備えたファクトリをFoos慣例により呼び出す必要があります。

  2. 返されるオブジェクトのクラスはすべて非公開です

    つまり、ファクトリメソッドから返されるオブジェクトのクラスには、のようにプライベートまたはデフォルトの可視性修飾子private class MyFoo{}があり、ファクトリメソッド以外の方法でインスタンス化することはできません。newプライベート内部からの演算子を使用してオブジェクトを構築したり、スコープ外のプライベートクラスをパッケージ化したりすることはできないため(リフレクションは別として)。

例えば:

 public interface Foo{ //interface without plural 's' (question 1)
     public void bar();
 }
 public abstract class Foos(){ // abstract factory with plural 's' (question 1)
    public static Foo createFoo(){
        return new MyFoo();
    }
    private class MyFoo implements Foo{ // a non visible implementation (question 2)
       public void bar(){}
    }
 }
于 2011-05-25T18:31:14.937 に答える
4

呼び出されたインターフェイスがListあり、静的ファクトリメソッドを使用してさまざまなタイプのリストを作成するとします。Listインターフェイスであるため、インターフェイスで静的ファクトリメソッドを定義することはできません。したがって、あなたがしなければならないことは、Listを実装するクラスのインスタンスを返すクラスを持っているということです。

public class ListFactory{
  private ListFactory(){}
  public static List makeArrayList(){...}
  public static List makeLinkedList(){...}
  public static List makeCrazyList(){...}
}

あなたはこれを行うことはできません

public interface List{
   public static List makeArrayList();
   public static List makeLinkedList();
   public static List makeCrazyList();
}

Listインターフェースなので。

于 2011-05-25T18:39:27.307 に答える
2

たとえば、Collections.unmodizableList(...)を例にとってみましょう。Listの実装を返します。ただし、実装クラスの名前は関係ありません。さらに、上記のクラスは静的ファクトリメソッドを介してのみ構築されます。

于 2011-05-25T18:31:13.297 に答える
2
public interface Foo
    static public class Factory
        public Foo create(){..}

Foo foo = Foo.Factory.create();
于 2011-05-25T23:19:36.983 に答える
1

1)ここであなたの質問がわかりません。Collectionインターフェイスであり、次のCollectionsようないくつかのファクトリメソッドがありますemptyList

2)たとえば、によって返されるListインスタンスは、インターフェイスCollection.emptyListを実装するプライベートクラスのインスタンスです。List

于 2011-05-25T18:33:17.437 に答える
1

これは単に、の静的ファクトリメソッド(およびそのような他のクラス)の戻り型が、特定の実装クラス(eg)ではなくCollectionsインターフェイス型(eg )であることを意味します。これは、物事を複雑にし、増加させるため、ユーザーには表示されません。 APIのサイズ。Listjava.util.Collections.UnmodifiableList

于 2011-05-25T18:37:29.640 に答える