源码 | 静态工厂返回声明的返回类型的子类型的实例

与构造方法相比,静态工厂方法拥有三大优势:

  1. 有名称
  2. 不必在每次调用它们的时候都创建一个新的对象
  3. 可以返回声明的返回类型的子类型的实例

优势1、2显然。这里在Java8源码里找一个证明优势3的例子,备忘。

JDK版本:oracle java 1.8.0_102

可以返回声明的返回类型的子类型的实例

见Java8的Collections类:

    public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
        return new UnmodifiableSet<>(s);
    }

观察UnmodifiableSet类:

    /**
     * @serial include
     */
    static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                                 implements Set<E>, Serializable {
        private static final long serialVersionUID = -9215047833775013803L;

        UnmodifiableSet(Set<? extends E> s)     {super(s);}
        public boolean equals(Object o) {return o == this || c.equals(o);}
        public int hashCode()           {return c.hashCode();}
    }

可知,UnmodifiableSet的包级私有的。

Collections.unmodifiableSet()就是一个静态工厂方法,它可以返回原返回类型的任何子类型的对象,这带来了两大好处:

  • 接口开发者对外承诺的返回类型是Set,而实现中却可以使用Set接口的任意一个实现类,比如这里返回的实现类就是不可变类UnmodifiableSet
  • 接口开发者只需要将Set设为公有的,UnmodifiableSet的可以是任意访问权限,比如这里是包级私有的

类似的例子还有UnmodifiableMap、CopiesList等,非常之多。


本文链接:源码|静态工厂返回声明的返回类型的子类型的实例
作者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,294评论 0 16
  • 地址:https://github.com/ShuailongWang/slider使用:把文件拖进去后,导入头文...
    飞天蛤蟆阅读 231评论 0 0
  • 雨,淅淅沥沥地下,一天,两天,三天……一雨知秋凉。 立秋后,虽然早晚微凉,但下午依然闷热。有天还看见一位男同事上罢...
    简远山人阅读 1,383评论 2 11