前言
自己java编程已有两年,自己也写过一些轮子,也在工作中针对自己以前写的代码重构过,但是距离那些优秀的类库总有一些差距,最近在看 Effective Java 第三版,书中总结甚为精辟,遂在阅读过程中逐条写下笔记,以指导自己更加有效的使用 java 编程语言及基本类库,涵盖部分jdk 7,8,9 的新特性
目的
Consider static factory methods instead of constructors
用静态工厂方法代替构造器
正文
思考
对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供一个公有的构造器,但同时,你是否应该考虑提供一个公有的静态工厂方法,来返回此类的实例的静态方法?
提供静态工厂方法的优势
1 | * 它们有名字,比起构造方法的不同参数列表,静态工厂方法能提供有含义且带有参数的初始化方法 |
我们现在对每条优点来实践一下
1.它们有名字
假设我们有一个苹果类 (Appale.java) 它有三个属性:颜色(color),重量(weight)和是否好吃(delicious)
1 | /** |
类中的注释很好的说明了问题,另外调用时候的意义也更加明确
1 | //设置一个好吃的红苹果,直接将好吃和不好吃封装到了api里面,通过函数名字表示,用户就很难调用错误的方法 |
2.单例模式
这里可以看一下之前在读java编程思想-类的访问权限的时候所做的笔记:java编程思想第四版第六章读书笔记
3.基于接口的框架
例如 jdk 中 java.util.Collections.java 类其中的很多方法就是返回类型是一个接口,其真正返回的是它的子类对象
1 | public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) { |
扩展:https://blog.csdn.net/cilen/article/details/7744969 Collections.unmodifiableList方法的使用与场景
4.返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值
例如 jdk 中 EnumSet 的noneOf方法
1 | public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { |
5.方法返回的对象所属的类,在编写包含该静态工厂方法的类时,可以不存在,构成了服务提供者框架(Service Provider Framework)例如 JDBC API
TODO:等我看了相关api再来记录
提供静态工厂方法的缺点
1 | * .类如果不含有公有的或者受保护的构造器,就不能被子类化 |
常用静态工厂方法的取名
1 | * from: 类型转化方法 |
梨子:
1 | /** |
参考资料
https://blog.csdn.net/cilen/article/details/7744969 Collections.unmodifiableList方法的使用与场景 cilen