针对构造方法
重叠构造器模式
重叠构造器模式是一种编程中的反模式,指的是一个类有多个构造函数,每个构造函数都有不同数量的参数,从而可以根据不同的情况创建对象。这种方式会导致代码可读性和可维护性降低,因为构造函数过多,参数顺序容易混淆。
JavaBeans模式
可以用一个无参的构造函数来创建对象,然后用set方法来设置各个参数,从而避免多个构造函数。
Javabean模式的优点是:
- 可以提高代码的复用性和可维护性
- 可以通过反射机制实现对象的自动装配和操作
- 可以与其他技术如JSP、EJB等进行集成和交互
Javabean模式的缺点是:
- 需要编写大量的get和set方法
- 增加了代码量和出错的可能性
- 需要实现Serializable接口,可能会影响性能和安全性
- 违背了可变性最小化原则
构建器模式
可以用一个可变的辅助类来设置对象的各个参数,然后用一个不可变的类来复制这些参数,从而避免多个构造函数或者多个set方法
缺点:这个模式也有风险,比如建造builder对象本身就消耗资源,而且相比于重叠构造器(telescope constructor),这个模式显得啰嗦了。所以用不用这个模式本质上需要权衡利弊,书中建议当参数比较多(大于5个),或者考虑到未来可能扩展参数时,考虑用builder模式。
针对普通方法
拆分成多个方法
每个方法只需要包含一种子集,通过提升正交性可以减少方法数目。例如java.util.List接口,它并没有提供子列表sublist中查找元素第一个索引和最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了subList方法,这个方法带有两个参数,并返回子列表的一个视图,这个方法可以与indexOf或者lastIndexOf方法结合起来,获得期望的结果。而这两个方法分别只有一个参数,而且subList可以和其他针对list实例操作的方法结合,这样的API有很高的功能-权重(power-to-weight)比
创建辅助类
一个频繁出现的参数序列可以被看做代表某个独特的实体,比如一个表示表示纸牌游戏的类,如果需要经常传递点数和花色两个双参数,就可以增加辅助类表示一张纸牌,并把每个参数序列都换成辅助类的单个参数。
构建器模式
从对象构建和方法调动都采用builder模式,如果方法带有多个参数且多个都是可选的,最好顶一个对象表示多有参数,并允许客户端在这个对象上进行多次setter调动,每次调用都会设置一个参数,或者设置一个较小的相关集合。设置完所有参数后,客户端就调用对象的执行execute方法,它对参数进行最终有效性检查,并执行实际的计算。
参考一:嵌套类(Java™ 教程> 学习Java语言>类和对象) (oracle.com)
参考二:《effective java》第02章:创建和销毁对象/第1项:考虑静态工厂方法而不是构造函数https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC02%E7%AB%A0%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%92%8C%E9%94%80%E6%AF%81%E5%AF%B9%E8%B1%A1/%E7%AC%AC1%E9%A1%B9%EF%BC%9A%E8%80%83%E8%99%91%E9%9D%99%E6%80%81%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E8%80%8C%E4%B8%8D%E6%98%AF%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0.md第02章:创建和销毁对象/第2项:当面临多个参数的构造器时考虑使用构建器https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC02%E7%AB%A0%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%92%8C%E9%94%80%E6%AF%81%E5%AF%B9%E8%B1%A1/%E7%AC%AC2%E9%A1%B9%EF%BC%9A%E5%BD%93%E9%9D%A2%E4%B8%B4%E5%A4%9A%E4%B8%AA%E5%8F%82%E6%95%B0%E7%9A%84%E6%9E%84%E9%80%A0%E5%99%A8%E6%97%B6%E8%80%83%E8%99%91%E4%BD%BF%E7%94%A8%E6%9E%84%E5%BB%BA%E5%99%A8.md
第04章:类和接口/第24项:静态成员类优于非静态成员类https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC04%E7%AB%A0%EF%BC%9A%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3/%E7%AC%AC24%E9%A1%B9%EF%BC%9A%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E7%B1%BB%E4%BC%98%E4%BA%8E%E9%9D%9E%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E7%B1%BB.md第08章:方法/第51项:谨慎设计方法签名https://gitee.com/lin-mt/effective-java-third-edition/blob/master/%E7%AC%AC08%E7%AB%A0%EF%BC%9A%E6%96%B9%E6%B3%95/%E7%AC%AC51%E9%A1%B9%EF%BC%9A%E8%B0%A8%E6%85%8E%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%B3%95%E7%AD%BE%E5%90%8D.md
参考三:还在new对象吗?试试静态工厂方法--Effective Java第二章 - 知乎 (zhihu.com)