有效的Java作者:Joshua Bloch:第1项 – 静态工厂方法
我正在阅读Joshua Bloch的Effective Java
,我对Item1 Static Factory Method
有疑问。
引用[布洛赫,第7页]
接口不能使用静态方法,因此按照惯例,名为Type的接口的静态工厂方法放在名为Types的不可实例化的类中。 例如,Java Collections Framework提供不可修改的集合,同步集合等。 几乎所有这些实现都是通过一个不可实例化的类(java.util.Collections)中的静态工厂方法导出的。 返回对象的类都是非公共的。
好。 查看源代码时,我看到java.util.Collection
接口和带有私有构造函数的java.util.Collections
类(不可实例化的类)。 我看到不可实例化的类Collections具有所有静态方法,就像Bloch所说的那样。 但布洛赫说,我没有看到两个class级之间的联系
接口不能使用静态方法,因此按照惯例,名为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
。 -
返回对象的类都是非公共的
这意味着从工厂方法返回的对象类具有私有或默认可见性修饰符,如
private class MyFoo{}
因此除了工厂方法之外,它们不能通过任何其他方式实例化。 因为你不能使用私有内部或包私有类中的new
运算符来构造一个Object,而不是它们的范围(reflection旁边)。
例如:
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(); }
由于List
是界面。
所以以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
接口的私有类的实例。
它只是意味着Collections
(和其他类似的)中的静态工厂方法的返回类型是接口类型(例如List
)而不是特定的实现类(例如java.util.Collections.UnmodifiableList
),这些类对用户不可见因为那会使事情复杂化并增加API的大小。