24

我正在阅读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

4

6 回答 6

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

    重点只是"Type[s]" 上的复数“s”。所以如果你的接口被调用Foo并且你想创建一些被调用的实现,MyFoo那么你的工厂应该按照Foos惯例调用实例化方法。

  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(){}
    }
 }
于 2011-05-25T18:31:14.937 回答
4

假设您有一个调用的接口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是接口。

于 2011-05-25T18:39:27.307 回答
2
public interface Foo
    static public class Factory
        public Foo create(){..}

Foo foo = Foo.Factory.create();
于 2011-05-25T23:19:36.983 回答
2

Collections.unmodifiableList(...)为例。它返回 List 的一些实现。但实现类的名称无关紧要。此外,该类通过静态工厂方法构造。

于 2011-05-25T18:31:13.297 回答
1

1)我不明白你的问题。Collection是接口并且Collections有一些工厂方法,比如emptyList

2) 例如,返回的 List 实例是Collection.emptyList实现List接口的私有类的实例。

于 2011-05-25T18:33:17.437 回答
1

它只是意味着Collections(和其他类似的类)中的静态工厂方法的返回类型是接口类型(例如List)而不是特定的实现类(例如java.util.Collections.UnmodifiableList),它们对用户不可见,因为这只会使事情复杂化并增加API 的大小。

于 2011-05-25T18:37:29.640 回答