读书笔记——Effective Java
jzlcheng
个人学习记录
展开
-
考虑用静态工厂方法代替构造器
1.考虑用静态工厂方法代替构造器 优点: 静态工厂方法有名称,当一个类有多个相同签名的构造器时,以静态工厂方法替代之,并使用有意义的名称。 不必每次调用它们的时候都创建一个新对象。 可以返回原返回类型的任何子类型的对象。 创建参数化类型实例时,代码更简洁。 缺点: 类如果不含公有的或者保护的构造器,就不能被子类化。 静原创 2018-01-17 16:03:13 · 134 阅读 · 0 评论 -
遇到多个构造器参数时考虑使用构建器
静态工厂和构造器的局限:不能很好的扩展到大量可选参数。 方法1 习惯用法:重叠构造器。提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,以此类推。 缺点:参数较多时,客户端代码难以编写,难以阅读。 方法2 JavaBeans模式:调用一个无参构造器来创建对象,调用setter方法设置每一个必要参数,及可选参数。原创 2018-01-17 17:21:33 · 385 阅读 · 0 评论 -
通过私有构造器强化不可实例化的能力、避免创建不必要的对象、消除过期的对象引用
4.通过私有构造器强化不可实例化的能力 工具类不希望被实例化。 企图通过将类做成抽象类来强制该类不被实例化是行不通的,因为该类可以被子类化,而该子类可以被实例化。 只有当类不含有显示构造器时,编译器才会生成缺省构造器,因此可设置私有构造器即可解决问题。5.避免创建不必要的对象 对于同时提供静态工厂方法和构造器的不可变类,优先使用静态工厂方法,以避免创建不必要的类。 自原创 2018-01-18 17:40:36 · 149 阅读 · 0 评论 -
用私有构造器或者枚举类型强化Singleton属性*
java 1.5之前方法1 私有构造器,公有静态final域public class Elvis(){ public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public void leaveTheBuilding(){}}缺点:享有特权的客户端可以通过AccessibleObject.s原创 2018-01-18 15:14:14 · 297 阅读 · 0 评论 -
避免使用终结方法(finalizer)
从一个对象变得不可到达,到它的终结方法被执行,所经历的时间是任意的。JVM会延迟执行终结方法。 终结方法的执行是垃圾回收算法的一个主要功能,不同JVM的实现大相径庭。 不应该使用终结方法来更新重要的持久状态。 终结方法会拉低性能。 提供显示的终止方法,如InputStream、OutputStream和java.sql.Connection的close方法。显示终止方法通常原创 2018-01-18 18:41:35 · 288 阅读 · 0 评论 -
覆盖equals时遵守通用约定
不覆盖equals时,类的每个实例都只与它自己相等。如果类有自己的逻辑相等概念,且超类未覆盖equals以实现期望的行为,这时需覆盖equals。约定内容: 1.自反性----对于任何非null的引用值x,x.equals(x)必须返回true 2.对称性----对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true原创 2018-01-19 12:07:11 · 127 阅读 · 0 评论 -
覆盖equals时总要覆盖hashCode
覆盖equals时必须覆盖hashCode,否则该类无法结合所有基于散列函数的集合正常运作,如HashMap、HashSet和HashTable。约定: 1.程序执行期间,只要对象equals方法所用到的信息没有改变,hashCode方法必须返回同一个整数。程序对此执行过程中,返回整数可以不同。 2.如果两个对象equals方法比较相同,那么hashCode返回相同整数。 3.如原创 2018-01-19 14:58:19 · 169 阅读 · 0 评论 -
始终覆盖toString、谨慎覆盖clone、考虑实现Comparable*
始终覆盖toStringjava.lang.Object提供toString方法的一个实现,返回值:类的名称,一个@符号,散列码的无符号16进制表示。谨慎覆盖clone考虑实现Comparable原创 2018-01-19 16:05:10 · 139 阅读 · 0 评论 -
用于精确计算的BigDecimal
float和double类型主要为了科学计算和工程计算而设计。它们执行二进制浮点运算,提供较为精确的快速近似计算。float和double尤其不适用于货币计算。解决办法:使用BigDecimal、int或long进行货币计算使用int或者long时,以分位单位进行计算,而不是以元为单位。BigDecimal: 构造器 BigDecimal(int) BigDec...原创 2018-02-11 17:04:44 · 161 阅读 · 0 评论