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)都有通用约定 ...
随机推荐
- 字符串编码(ASCII, GBK, ANSI, Unicode(‘u‘), UTF-8编码)(转载)
[版权声明]本篇文章以征得博主同意,再行转载. 出自[hxxjxw] 原文链接:https://blog.csdn.net/hxxjxw/article/details/90140663 目录 字符串 ...
- R语言画图常用参数
plot(x,xlab = "degree",ylab = "number of nodes",main = "mRNA degree distrib ...
- MyBatis中的 10 个宝藏技巧!
前言 说到 MyBatis,很多小伙伴都会用,但未必用得"惊艳". 实际上,这个轻量级的持久层框架还有很多隐藏的"宝藏技巧". 如果你能掌握这些技巧,不但能让开 ...
- SpringCloud(四) - 微信获取用户信息
1.项目介绍 2.微信公众平台 和 微信开放文档 2.1 微信公众平台 2.1.1 网址链接 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?ac ...
- w3cschool-Apache Kafka 教程
参考https://www.w3cschool.cn/apache_kafka/ Apache Kafka 基础 2021-07-27 16:23 更新 对于大数据,我们要考虑的问题有很多,首先海量数 ...
- Hyper-V创建虚拟机配置IP等网络配置原理(Linux、Windows为例)
大家知道Windows系统里面内置了Hyper-V管理器,用来创建和管理本地虚拟机环境.今天我创建了两台虚拟机,一台是CentOS7.9(Linux),另一台是Windows 11,然后发现,Linu ...
- CentOS 7 MongoDB 重装启动失败
诊断过程 1. 错误提示: > journalctl -xe 提示: .... ERROR: child process failed, exited with error number 14 ...
- xshell连接服务器无法用password登录,只能用public key的解决办法
xshell无法用password登录服务器,只能用public key的解决办法 只能用public key登录, 那么我们用阿里云后台的远程连接按钮进入服务器,进入后 修改/etc/ssh/ssh ...
- Kali 安装谷歌拼音
Kali 安装谷歌拼音 1. 安装 Google 输入法 sudo apt install fcitx-googlepinyin 2. 重新启动系统 reboot 3. 打开开始菜单,搜索fcitx配 ...
- OI 超几何函数与Gosper算法入门
前言 据说这个东西是 19~20 初世纪数学研究的重大成果与主要研究方向.但是很可惜,由于世界形势的变化,以德国为中心的的超几何函数.椭圆函数研究开始没落于集中于美国.苏联的数学研究飞向. 第一章 定 ...