Effective Java理解笔记系列-第1条-何时考虑用静态工厂方法替代构造器?
为什么写这系列博客?
在阅读《Effective Java》这本书时,我发现有许多地方需要仔细认真地慢慢阅读并且在必要时查阅相关资料才能彻底搞懂,相信有些读者在阅读此书时也有类似感受;同时,在解决疑惑的过程中,还存在着有些内容不容易查找、查找到的解答质量不高等问题,于是我决定把我阅读此书收获到的东西写成博客,期望能够解答某些读者之困惑。
为了方便大家阅读时按章节查找,我会按照原书籍写作顺序来划分博客章节。博客中主要包含以下内容:
- 我对原文内容的理解(再加工)
- 一些补充知识(需要理解这些知识才能真正理解该章节内容)
创建和销毁对象
何时考虑用静态工厂方法替代构造器?
无法准确描述
该实例无法通过构造器名称和参数完整描述。--》目的:方便用户正确调用。
BigInteger(int,int,Random) // 使用构造器
BigInteger.probablePrime(int,int,Random)//静态工厂方法
//以上构造器返回的实例可能为质数,通过构造器名称BigInteger和参数列表无法体现出质数,所以用静态工厂方法更好。
重复利用缓存
不可变类在创建实例时重复利用事先构建好或已缓存的实例。--》目的:避免创造不必要对象,降低内存提升性能;客户端可以用==操作符替代equals方法,提升性能,如:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b){
return b? Boolean.TRUE:Boolean.FALSE;//通过valueOf调用得到的某个值的实例都是一个实例,所以可以用==来比较
}
隐藏实现类
返回接口类型,隐藏实现类--》目的:客户端使用只需关注接口功能即可,而不需要关注具体实现类;可灵活替换返回对象,而客户端不需要修改代码。
隐藏实现类的方法:使用内部类
- 静态内部类:Collections类中的UnmodifiableList内部类
- 实例内部类:LinkedList类中的ListItr内部类
导出实现类的方法:
- 静态工厂导出,如:Collections类中的静态工厂方法:unmodifiableList
- 通过实例方法导出,如:LinkedList类中的实例方法:listIterator
其他补充知识:
当内存中只需要一份,没有多个实例化的需求,不需要多份时,就考虑使用静态变量和静态方法(注意保持不可实例化,私有构造函数并抛出异常),如:各种工具类(java.lang.Math);管理器类(JDBC的java.sql.DriverManager)
内部类:
使用场景:该内部类只和当前外部类(相对而言)相关,而和其他类无关,其他类不需要知晓该类的存在。
静态or实例?如果该内部类不需要使用实例域或者外部类没有实例域,用静态内部类;反之用实例内部类
方法内部类和匿名内部类如何选择?
- 这两个类都是只限定在当前方法内可用,方法外不可用
- 如果只需要创建一个对象,使用匿名内部类即可;反之,需要多次创建对象,那么使用方法内部类
匿名内部类的常见使用场景:定义比较器或者事件响应逻辑
框架开发经验:考虑哪部分是不变的固定逻辑,哪部分是开发者需要自定义的逻辑,提供一个接口让开发者实现即可。
避免繁杂类型参数
利用编译器的类型推导,避免实例化时编写繁杂的类型参数--》目的:让代码更加简洁。
//未使用静态工厂写法
Map<String,List<String>> map = new HashMap<String,List<String>>();
//工具类
public class MapUtil{
//避免实例化
private MapUtil{}
//静态工厂方法
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
}
//使用静态工厂写法
Map<String,List<String>> map = MapUtil.newIntance();
总结
提升简洁性:第四条
提高易用性:第一条;第三条前半部分
可扩展性:第三条后半部分
提升性能:第二条
Effective Java理解笔记系列-第1条-何时考虑用静态工厂方法替代构造器?的更多相关文章
- Effective java读书札记第一条之 考虑用静态工厂方法取代构造器
对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它 ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- effective java 3th item1:考虑静态工厂方法代替构造器
传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多 ...
- 改善JAVA代码01:考虑静态工厂方法代替构造器
前言 系列文章:[传送门] 每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器 ...
- Java - 用静态工厂方法代替构造器
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...
- 高效JAVA之用静态工厂方法代替构造器
程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪 ...
- Effective Java —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法
避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不 ...
- Effective Java读书笔记——第三章 对于全部对象都通用的方法
第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...
随机推荐
- 变分推断(VI)、随机梯度变分推断(SGVI/SGVB)、变分自编码器(VAE)串讲
参考资料: VI参考:PRML Chapter 10. SGVI原文:Auto-Encoding Variational Bayes -- Kingma. VAE参考1:Tutorial on Var ...
- 可扩展系统——基于SPI扩展
一.我们为什么讨论SPI? 为具有悠久历史的大型项目(屎山)添加新功能时,我们常常不太好评估变更的影响范围.因为原系统不具备良好的扩展性,导致修改整体发散,且不易单测.此时可以考虑使用接口来描述业务逻 ...
- 【译】在分析器中使用 Meter Histogram(直方图)解锁见解
您是否正在与应用程序中的性能瓶颈作斗争?不要再观望了!Visual Studio 2022 在其性能分析套件中引入了 Meter Histogram(直方图)功能,为您提供了前所未有的分析和可视化直方 ...
- CDS标准视图:技术对象检验级别 I_TechObjInspectionLevelCode
视图名称:技术对象检验级别 I_TechObjInspectionLevelCode 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog: { sqlViewName: 'ITECHO ...
- 再谈Redux
2025年再聊前端状态管理似乎是一件不必要的事,毕竟相关文章已堆积得如山如海.但在这些文章或视频内容中,我并没有找到自己喜欢的方案,准确的说是使用方式.所以这篇文章不做技术分析,主要聊聊个人对状态管理 ...
- MongoDB:【索引的管理操作】
- Linux基础:从命令行管理文件系统权限
- Popup弹出层滚动不流畅
使用 Vant 框架中的 van-popup 组件(弹框组件);导致列表上下滑动不流畅 Popup 弹出层 滚动不流畅 <van-popup v-model="conFlag" ...
- 【异步编程实战】如何实现超时功能(以CompletableFuture为例)
[异步编程实战]如何实现超时功能(以CompletableFuture为例) 由于网络波动或者连接节点下线等种种问题,对于大多数网络异步任务的执行通常会进行超时限制,在异步编程中是一个常见的问题.本文 ...
- DPDK简介和原理
本文分享自天翼云开发者社区<DPDK简介和原理>,作者:s****n DPDK是一种绕过内核直接在用户态收发包来解决内核性能的瓶颈技术. 什么是中断 了解DPDK之前,首先需要先了解什么是 ...