本书是JAVA 经典书籍之一,我看的是第二版的英文版(英文版比较便宜,哈哈),基于Java5的,值得一看:
我们先来了解下作者:
Joshua Bloch,是Google公司的首席Java架构师。是Jolt大奖的获得者。他曾是Sun公司的杰出工程师,和Transarc公司的高级系统设计师。Bloch曾带领团队设计和实现过无数的Java平台特性,包括JDK 5.0语言增强版和获奖的Java Collections Framework。他的著作还包括:《Java Puzzlers》、《Java Concurrency in Practive》等。
构建对象主要有七条规则,我认为比较重要的标识为红色
一. 在创建类的实例时,用静态的工厂方法代替构造方法:
注意这里的工厂方法不是工厂模式,相比构造方法有如下好处:
(1)命名更加直观,构造方法多个时不知道每个构造方法构造出来的对象有什么不同。
(2)结合单例模式可以避免对象重复创建,指向相同的内存块,可以节约内存。
(3)可以返回这个类的任何子类,这样就可以大大提高返回参数的灵活性,在策略模式中有较为明显的好处。
(4)可以避免实例化是很冗长的参数
一个例子,假如你要实例化一个Map
private static Map<String, PolicyStrategy> policyStrategyMap = new HashMap<String, PolicyStrategy>();
如果HashMap 提供了这样一个方法,
public static <k,v> HashMap<k,v> newInstance(){
return new HashMap<K,V>();
}
这样上面的代码就可以修改为
private static Map<String, PolicyStrategy> policyStrategyMap = HashMap.newInstance();
遗憾的是JDK没有如此实现,你还是只能按照前面的来写
缺点所列的两条我认为有些牵强,不提了
总之,能用static方法的尽量用。
二.当参数太多时,考虑使用builder
这个规则比较好理解,当参数比较多时,调用时,要仔细看API,一个一个对照参数,很费事,特别是参数类型相同时
比如构建一个这样的对象
A a = new A(1,2,3,4,5);
很难理解吧,那你可以只构造一二个参数剩下的通过set 方法设置,最后build对象
调用方看来是这样的
A a = new A(1,2),setScale(3).setSize(4),setAge(5).build()
这个实体构建的代码应该很容易想到怎么写了吧。
总之,构建对象时,如果参数在5个以上,最好用这种方式。
三.用static 和 private的构造函数或者enum构建单例的对象
这个我们经常使用的,比如,一栋楼只有一部电梯:
public class Elivis {
public static final Evlis Instance = new Elivis;
private Elivis{};
public void leaveTheBuilder(){……}
}
使用enum实现
public class Elivis {
INSTANCE;
public void leaveTheBuilder(){……}
}
使用enum更加好一些
四.用私有的构造对象,强制不可实例化
这个比较常用,只是我们一般用的时候都只是构造私有的空构造方法,没有抛出异常,这里强调一下要抛出异常,防止类内部的构造
public class AA{
private AA{
throw new AssertionError();
}
……
}
五.不创建多余的对象
这一点非常重要,
比如永远不要在程序里保有这样的代码
String s = new String("dingjob");
这样每次调用时都会创建一个对象,可以这样升级它
String s ="dingjob";
这样在同一个虚拟机里运行的程序,如果恰好也要应用“dingjob”这个字符串,则引用的是同一个地址。在静态util类里面尤其要注意。
比如下面的例子,判断一个人是否在45 到65年之间出生。
public boolean isBothBetween45and64(Date birtDate){
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1945,Calender.JANUARY,1,0,0,0)
Date boomStart = gmtCal.getTime();
gmtCal.set(1965,Calender.JANUARY,1,0,0,0)
Date boomEnd = gmtCal.getTime();
return birtDate.compareTo(boomStart )>=0&&
birtDate.compareTo(boomEnd )<=0
}
应该这样改造
public class Person{
private static final Date birtDate;
private static final Date boomStart;
private static fianl Date boomEnd;
static {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1945,Calender.JANUARY,1,0,0,0)
Date boomStart = gmtCal.getTime();
gmtCal.set(1965,Calender.JANUARY,1,0,0,0)
Date boomEnd = gmtCal.getTime();
}
public boolean isBothBetween45and64(Date birtDate){
return birtDate.compareTo(boomStart )>=0&&
birtDate.compareTo(boomEnd )<=0
}
}
实践证明,当有很多次调用时,后面的效率有可能是前面的程序效率的250倍
分享到:
相关推荐
Effective Java Effective Java Effective Java
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
程序设计超级经典书籍 Java 编程语言(第三版)---Java 四大名著----James Gosling(Java 之父) Java 编程思想(第2版)----Java 四大名著----Bruce Eckel Java 编程思想(第3版)----Java 四大名著----------------...
effective-java 自己用网上的翻译的html版本,生成的pdf版,仅供参考,仅供参考,仅供参考,仅供参考
Effective Enterprise Java
effective-java-3rd-chinese前51条:文章翻译来源地址:about this repository本来以为只是个直接搬运的活,实际上不是。主要工作如下:改进排版,原有博文排版不太优秀,根据markdown 排版指北重新排版。内容修改,...
effective-java 配套代码
effective-java-3rd-chinese 前51条:文章翻译来源地址: 现在全部章节已经更新完成 :提供更好的在线阅读版本 : 提供更快的访问速度 写在最前面 本 repo 从来没有授权过任何公众号进行发布转载,所有公众号的引流...
如果这些假设是错误的,生成的程序可能缺少足够的同步(详见 78 条)或过度的同步(详见 79 条)。无条件线程安全 — 该类的实例是可变的,但是该类具有足够的内
effective-go-zh-en-gitbooke
Effective Java读书笔记.pdf
Effective java 3 学习记录
【Effective Java】阅读笔记markdown 文件
effective java 读书笔记,第二版自己摘要并翻译,以备速查。
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理
java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...
java源码测试 effective-java 读Effective Java(中文版第3版)阅读源码测试案列
构建高效的Java企业级系统是项困难的工作。本书详细介绍企业级计算技术中的常见问题,并描述使用企业级Java平台技术处理这些问题的方法。本书以若干条建议、揸南的形式,言简意赅地介绍了J2EE开发中的微妙之处。无论...