2017-12-05-effective-java
java 语言四种类型
接口(interface)、类(calss)、数组(array)、基本类型(primitive)
接口、类、数组称为引用类型,类实例和数组是对象(object),而基本类型的值不是对象。
类的成员由域(field)、方法(method)、成员类(member class)和成员接口(member interface)组成。
方法签名(signature)由它的名称和所有参数类型组成,签名不包括返回类型
导出的 API 是指类、接口、构造器(constructor)、成员和序列化形式(serialized form),程序员通过它们可以访问类、接口或包。使用 API 编写程序的程序员被称为该 API 的用户(user),在类的实现中使用了 API 的类被称为该 API 的客户(client)。
类、接口、构造器、成员以及序列化形式被统称为 API 元素(API element)
创建对象和销毁对象
- 使用静态工厂方法代替构造器
- 遇到多个构造器参数时要考虑用构建器(builder 模式)
- 用私有构造器或者枚举类型强化 Singleton 属性(单元素的枚举类型已经成为实现 Singleton 的最佳方法)
- 通过私有构造器强化不可实例化的能力(工具类做成抽象类来强制不可实例化不可取,因为可以被子类化,最好是有显式私有构造器,这样工具类不能被子类化)
- 避免创建不必要的对象(优先使用基本类型而不是装箱基本类型,小心无意识的自动装箱,非重量级对象避免创建对象池)
- 消除过期的对象引用(清空对象引用应该是一种例外,而不是一种规范行为;只要在缓存之外存在对某个项的键的引用,该项就有意义,可以使用 WeakHashMap 代表缓存)
- 避免使用终结方法(终结方法 finalizer 通常不可预测,避免使用;java 中使用 try-finally 块完成回收非内存资源,终结方法不一定会被执行,System.gc 和 System.runFinalization 增加终结方法的执行机会,不应该依赖终结方法来更新重要的持久状态。System.runFinalizersOnExit 和 Runtime.runFinalizersOnExit 声称保证终结方法被执行,有致命缺陷被废弃,内部匿名类终结方法守卫者,防止子类的终结方法未能调用 super.finalize)
对于所有对象都能用的方法
- 覆盖 equals 时遵守能用约定