《Effective Java 2nd》第7章 方法
关注点:可用性、健壮性、灵活性
第38条 检查参数的有效性
在编写方法或者构造器的时候,应该考虑参数有哪些限制,并显式检查
第39条 必要时进行保护性拷贝
如果类具有从客户端得到或者返回到客户端的可变组件,为了维持不可变性,必要时进行保护性拷贝。
否则,在文档中写明,不可修改此组件。
举例:
public final class Period {
private final Date start;
private final Date end;
public Period(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException(strat + "after" + end);
}
this.start = start;
this.end = end;
}
public Date start() {
return start;
}
public Date end() {
return end;
}
}
Period表示一段不可变的时间周期。
但是,Period并不是不可变的!!!因为Date是可变的。
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
end.setYear(78);//因为Date是可变的,导致p被修改了
解决方法:
public Period(Date start, Date end) {
//先进行保护性拷贝,然后再对拷贝后的进行检查
this.start = new Date(start.getTime()); //使用保护性拷贝
this.end = new Date(end.getTime()); //使用保护性拷贝
if (this.start.compareTo(this.end) > 0) {
throw new IllegalArgumentException(strat + "after" + end);
}
}
Period仍旧是可以被改变的。
Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
p.end().setYear(78);//因为Date是可变的,导致p被修改了
解决方法:
public Date start() {
return new Date(start.getTime());
}
public Date end() {
return new Date(end.getTime());
}
第40条 谨慎设计方法签名
1.避免过长的参数列表。4个参数,或者更少。
不要定义相同类型的长参数序列,容易不小心弄错了参数顺序。
如何缩短过长参数列表?
1)拆分成多个方法
2)创建辅助类,保存参数的分组。
3)采用Builder模式。在方法带有多个参数,且有些是可选参数的时候,这个方法尤其有用!
2.对于参数类型,优先使用接口而不是类。
3.对于boolean类型,优先使用两个元素的枚举类型
第41条 慎用重载
为何慎用重载?
因为在特殊情形(类型转换、自动装箱拆箱等)下,很难确定到底哪个重载方法会被调用。
建议
1) 对于多个有相同参数数目的方法来说,应尽量避免重载。
2)要避免这种情况:同一组参数只需经过类型转换就能传递给不同的重载方法。
举例:m(List<?> s),m(Set<?> s),m(Collection<?> s)。
第42条 慎用可变参数
在重视性能情况下,使用可变参数要小心。可变参数的每次调用都会导致一次数组分配和初始化。
如何改进?当确定95%的调用有3个或更少的参数时,定义5个重载方法。
m()
m(int a)
m(int a, int b)
m(int a, int b, int c)
m(int a, int b, int c, int ....rest)
第43条 返回零长度的数组或集合,而不是null
对于返回类型为数组或集合的方法返回一个零长度的数组或者集合,而不是返回null。
第44条 为所有导出的API元素编写文档注释
《Effective Java 2nd》第7章 方法的更多相关文章
- [Effective Java]第七章 方法
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- EFFECTIVE JAVA 第十一章 系列化
EFFECTIVE JAVA 第十一章 系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...
- effective java 第2章-创建和销毁对象 读书笔记
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...
- Effective Java —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- [Effective Java]第三章 对所有对象都通用的方法
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 对于所有对象都通用方法的解读(Effective Java 第三章)
这篇博文主要介绍覆盖Object中的方法要注意的事项以及Comparable.compareTo()方法. 一.谨慎覆盖equals()方法 其实平时很少要用到覆盖equals方法的情况,没有什么特殊 ...
- 【Effective Java】第二章-创建和销毁对象——1.考虑用静态工厂方法代替构造器
静态工厂方法的优点: 可以赋予一个具有明确含义的名称 可以复用唯一实例,不必每次新建 可以返回原实例类型的子类对象 可以在返回泛型实例时更加简洁 缺点: 类如果不含有共有的或者受保护的构造器,就不能被 ...
- [Effective Java]第六章 枚举和注解
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [Effective Java]第五章 泛型
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- 【BZOJ3262】陌上花开 cdq分治
[BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...
- windows本地环境如何用wamp配置多域名绑定访问
https://jingyan.baidu.com/article/acf728fd5fcdadf8e510a3e5.html
- Hive格式化输出数据库和表详细信息
hive> desc database extended wx_test; OK wx_test hdfs://ns1/user/hive/warehouse/wx_test.db hadoop ...
- centos6.8 环境一键安装包 nginx配置thinkphp5
---恢复内容开始--- lnmp1.4 一键安装包 nginx配置thinkphp5 环境:Nginx1.12.1 PHP5.6 Coentos6.8 修改网站配置文件 ser ...
- Pandas使用to_csv保存中文数据用Excel打开是乱码
关于这个问题还是困扰了很久,我生成了一些样本数据,打算保存到csv文件,之后用pandas的命令: # data是DataFrame的格式 data.to_csv('./data/myfile.csv ...
- 使用docx4j编程式地创建复杂的Word(.docx)文档
原文链接:Create complex Word (.docx) documents programatically with docx4j 原文作者:jos.dirksen 发表日期:2012年2月 ...
- 分区默认segment大小变化(64k—>8M)
_partition_large_extents和_index_partition_large_extents 参考: http://www.xifenfei.com/2013/08/%E5%88%8 ...
- The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect.
Spring Framework Overview https://www.tutorialspoint.com/spring/spring_overview.htm Aspect Oriented ...
- 【Maven学习】Nexus OSS私服仓库的备份与迁移
背景 在上一篇博客 [Maven学习]Nexus OSS私服仓库的安装和配置 中,我们已经在机房搭建好了新的Nexus OSS私服仓库.下面是两个版本的Nexus OSS私服仓库的对比图. 老的Nex ...
- MySQL和MSSQL差异(增量)备份的原理
MySQL和MSSQL差异(增量)备份的原理 对于真正的增量备份来说,只需要记录当前每页最后的检查点的LSN,如果大于之前全备时的LSN,则备份该页面,否则不用备份 这大大加快了备份速度和恢复时间,同 ...