有效的Java作者:Joshua Bloch:第1项 - 静态工厂方法

Tha*_*ham 22 java design-patterns factory effective-java

我正在阅读Effective JavaJoshua Bloch,我对Item1有疑问Static Factory Method.

引用[布洛赫,第7页]

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

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

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

  1. 任何人都可以向我指出明显的事吗?

  2. 什么是他说的意思

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

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

fas*_*seg 26

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

    关键是"Type [s]"上复数"s".因此,如果您的接口被调用Foo并且您想要创建一些实现,MyFoo那么您的工厂应该Foos按惯例调用实例化方法.

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

    这意味着从工厂方法返回的对象类具有私有或默认可见性修饰符,private class MyFoo{}因此除了工厂方法之外,它们不能通过任何其他方式实例化.因为你不能使用new私有内部或包私有类的运算符来构造一个Object,而不是它们的范围(反射旁边).

例如:

 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(){}
    }
 }
Run Code Online (Sandbox Code Playgroud)

  • 你可以在没有API用户注意的情况下切换实现,因为他从未使用`new`构建其中一个对象.因此,如果您需要重新实现某些内容,则可以在不进行任何API更改的情况下创建新版本 (4认同)