Joshua Bloch撰写的有效Java:条款1-静态工厂方法

|| 我正在阅读Joshua Bloch的
Effective Java
,对Item1
Static Factory Method
有疑问。 报价[Bloch,第7页]   接口不能有静态方法,   因此按照惯例,静态工厂   名为Type的接口的方法   被置于非示例性的等级   命名类型。例如,Java   收藏框架,提供   不可修改的集合,已同步   收藏等。近乎全部   这些实现中的一部分是导出   通过静态工厂方法合而为一   不可实例化的阶级   (java.util.Collections)。班级   返回的对象全部   非公开。 好。当查看源代码时,我看到带有私有构造函数的
java.util.Collection
接口和
java.util.Collections
类(非实例化类)。而且我看到非实例化类Collections具有所有静态方法,就像Bloch所说的那样。但是我没有看到布洛赫所说的两个阶级之间的联系 接口不能具有静态方法,因此按照约定,名为Type的接口的静态工厂方法将放置在名为Types的不可实例化的类中。 谁能指出我的明显之处? 他说的是什么意思 返回对象的类都是非公共的 这是我获取Java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f     
已邀请:
接口不能具有静态方法,因此按照约定,名为Type的接口的静态工厂方法将放置在名为Types的不可实例化的类中。 关键是\“ Type [s] \”上的复数\'s \'。因此,如果您的接口称为
Foo
,并且您要创建一个称为
MyFoo
的实现,那么按照惯例,带有实例化方法的工厂应称为
Foos
。 返回对象的类都是非公共的 这意味着从工厂方法返回的对象类具有一个私有的或默认的可见性修饰符,如ѭ7中所示,因此,除了它们的工厂方法外,不能通过任何其他方式实例化它们。由于您不能使用inner8ѭ运算符从私有内部对象或将私有类打包到其作用域之外(而不是反射)来构造对象。 例如。:
 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(){}
    }
 }
    
假设您有一个名为
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();
}
由于“ 10”是接口。     
因此,以Collections.unmodifiableList(...)为例。它返回List的一些实现。但是实现类的名称无关紧要。此外,该类仅通过静态工厂方法构造。     
public interface Foo
    static public class Factory
        public Foo create(){..}

Foo foo = Foo.Factory.create();
    
1)我在这里不明白你的问题。
Collection
是接口,
Collections
有一些工厂方法,例如
emptyList
2)例如,由
Collection.emptyList
返回的List实例是实现
List
接口的私有类的实例。     
这仅表示means17ѭ(以及类似的其他类)中的静态工厂方法的返回类型是接口类型(例如
List
),而不是特定的实现类(例如
java.util.Collections.UnmodifiableList
),用户看不到它们,因为这会使事情复杂化并增加API的大小。     

要回复问题请先登录注册