Effective Java By Joshua Bloch: Item1 - Static Factory Method

我正在阅读Joshua Bloch的,我对Item1有疑问。Effective JavaStatic Factory Method

引用[布洛赫,第7页]

接口不能具有静态方法,因此按照惯例,名为 Type 的接口的静态工厂方法放在名为 Types 的不可实例化类中。例如,Java Collections Framework提供不可修改的集合,同步集合等。几乎所有这些实现都是通过静态工厂方法导出到一个不可证的类(java.util.Collections)中。返回对象的类都是非公共的。

还行。在查看源代码时,我看到带有私有构造函数(不可实例化类)的接口和类。我看到不可实例化的类 Collections 具有所有静态方法,就像 Bloch 所说的那样。但我没有看到布洛赫所说的两个类之间的联系。java.util.Collectionjava.util.Collections

接口不能具有静态方法,因此按照惯例,名为 Type 的接口的静态工厂方法放在名为 Types 的不可实例化类中。

  1. 任何人都可以向我指出显而易见的事情吗?

  2. 当他说这句话是什么意思

返回对象的类都是非公共的

以下是我获取java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f


答案 1
  1. 接口不能具有静态方法,因此按照惯例,名为 Type 的接口的静态工厂方法放在名为 Types 的不可实例化类中

    重点只是“Type[s]”上的复数“s”。因此,如果调用了接口,并且想要创建一些调用的实现,则应按约定调用具有实例化方法的工厂。FooMyFooFoos

  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(){}
    }
 }

答案 2

假设您有一个名为接口的接口,并且您希望使用静态工厂方法来创建不同类型的列表。您无法在接口中定义静态工厂方法,因为它是一个接口。因此,您必须做的是有一个类,该类返回实现List的类的实例ListList

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


推荐