博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective Java(1):静态工厂方法代替构造器
阅读量:6271 次
发布时间:2019-06-22

本文共 1287 字,大约阅读时间需要 4 分钟。

hot3.png

创建类的实例最常见的是new 除此外还可以使用静态工厂方法,来封装实例的细节,并且能控制实例的数量,减轻jvm的堆栈中的压力。静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。

静态工厂方法:静态工厂方法与别的静态方法没有什么区别,只不过该方法产生的类对象,不做其他事情。

静态工厂方法与构造器不同的优势在于:

  1. 静态工厂方法有名称

    静态工厂方法可以突破构造函数不能自由命名的限制,对于不同的工厂方法可以采用不同的会意的名字,是程序具有更好的可读性。

  2. 不必在每次调用的时候都创建一个新对象

    每次执行new语句时,都会创建一个新的对象。而静态工厂方法每次被调用的时候,是否会创建一个新的对象完全取决于方法的实现。

  3. 静态工厂方法可以返回原返回类型的任何子类型的对象

    new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用。

    静态工厂方法是用来产生对象用的,至于产生什么类型的对象没有限制,这就意味这只要返回原返回类型或原返回类型的子类型都可以。这样就可以更好达到封装的目的,降低API的数目和用户的使用难度。

  4. 在创建参数化类型实例的时候,使代码变得更加简洁

    例如,在调用参数化类的构造器时,即使类型参数很明显,也必须指明:

Map
> m = new HashMap
>();

        随着参数类型的越来越长、复杂,这一冗长的构造器参数说明也变得痛苦起来。但是有了静态构造方法,编译器就可以替你找到类型参数,这被称作类型推导(type inference)。例如:假设HashMap提供了以下静态工厂:

public static 
 HashMap
 newInstance() {    return new HashMap
();}

有了这个静态工厂方法,就可以用以下代码代替上述复杂繁琐的声明:

Map
> m = HashMap.newInstance();

利用特点3,静态工厂方法可用来创建以下类的实例。

  1. 单例类:只有惟一的实例的类。

  2. 枚举类:实例的数量有限的类。

  3. 具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。

  4. 具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。

静态工厂方法的缺点

  1. 类如果不含有公有的或受保护的构造器,就不能被子类化

    准确理解:如果父类没有提供Public的或者Protected的构造方法,那么使用静态工厂方法,将无法根据父类去获取到子类的实例。

  2. 静态工厂方法与其他的静态方法实际上没有任何区别

    比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。

转载于:https://my.oschina.net/u/1020238/blog/543334

你可能感兴趣的文章
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
MaxCompute 学习计划(一)
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>