首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >约书亚·布洛赫的有效Java : Item1 -静态工厂方法

约书亚·布洛赫的有效Java : Item1 -静态工厂方法
EN

Stack Overflow用户
提问于 2011-05-25 18:23:39
回答 6查看 13.7K关注 0票数 24

我正在读约书亚·布洛赫的“Effective Java”,我对Item1 Static Factory Method有疑问。

QuoteBloch,第7页

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

好的。当查看源代码时,我看到了带有私有构造函数(非实例化类)的java.util.Collection接口和java.util.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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-25 18:31:14

  1. 接口不能有静态方法,因此按照惯例,名为Type的接口的静态工厂方法被放入名为的不可实例化类中。 关键是复数‘on’Types‘。因此,如果您的接口名为Foo,并且希望创建一些名为MyFoo的实现,那么具有实例化方法的工厂应该按照约定调用Foos
  2. 返回对象的类都是非公共的。 这意味着从工厂方法返回的对象类有一个私有或默认的可见性修饰符,就像在private class MyFoo{}中一样,因此除了它们的工厂方法之外,其他任何方法都不能实例化它们。由于不能使用私有内部或包私有类中的new运算符构造对象,所以不能使用它们的作用域(反射除外)。

例如:

代码语言:javascript
运行
复制
 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(){}
    }
 }
票数 29
EN

Stack Overflow用户

发布于 2011-05-25 18:39:27

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

代码语言:javascript
运行
复制
public class ListFactory{
  private ListFactory(){}
  public static List makeArrayList(){...}
  public static List makeLinkedList(){...}
  public static List makeCrazyList(){...}
}

你不能这么做

代码语言:javascript
运行
复制
public interface List{
   public static List makeArrayList();
   public static List makeLinkedList();
   public static List makeCrazyList();
}

因为List是接口。

票数 4
EN

Stack Overflow用户

发布于 2011-05-25 18:31:13

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6129026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档