我正在读约书亚·布洛赫的“Effective Java”,我对Item1 Static Factory Method有疑问。
QuoteBloch,第7页
接口不能有静态方法,因此按照惯例,名为Type的接口的静态工厂方法被放入名为Type的不可实例化类中。例如,Java集合框架提供不可修改的集合、同步集合等等。几乎所有这些实现都是通过一个不可实例化类(java.util.Collections)中的静态工厂方法导出的。返回对象的类都是非公共的。
好的。当查看源代码时,我看到了带有私有构造函数(非实例化类)的java.util.Collection接口和java.util.Collections类。我看到非实例化类集合有所有的静态方法,就像Bloch所说的。但是,正如布洛赫所说,我看不出这两个类之间的联系。
接口不能有静态方法,因此按照惯例,名为Type的接口的静态工厂方法被放入名为Types的不可实例化类中。
返回对象的类都是非公共的。
这里是我获取java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f
发布于 2011-05-25 18:31:14
Foo,并且希望创建一些名为MyFoo的实现,那么具有实例化方法的工厂应该按照约定调用Foos。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-25 18:39:27
假设您有一个名为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-25 18:31:13
以Collections.unmodifiableList(.)为例。它返回List的一些实现。但是实现类的名称与此无关。此外,所述类仅通过静态工厂方法构造。
https://stackoverflow.com/questions/6129026
复制相似问题