0%

effective java

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)

创建对象和销毁对象

  1. 使用静态工厂方法代替构造器
  2. 遇到多个构造器参数时要考虑用构建器(builder 模式)
  3. 用私有构造器或者枚举类型强化 Singleton 属性(单元素的枚举类型已经成为实现 Singleton 的最佳方法)
  4. 通过私有构造器强化不可实例化的能力(工具类做成抽象类来强制不可实例化不可取,因为可以被子类化,最好是有显式私有构造器,这样工具类不能被子类化)
  5. 避免创建不必要的对象(优先使用基本类型而不是装箱基本类型,小心无意识的自动装箱,非重量级对象避免创建对象池)
  6. 消除过期的对象引用(清空对象引用应该是一种例外,而不是一种规范行为;只要在缓存之外存在对某个项的键的引用,该项就有意义,可以使用 WeakHashMap 代表缓存)
  7. 避免使用终结方法(终结方法 finalizer 通常不可预测,避免使用;java 中使用 try-finally 块完成回收非内存资源,终结方法不一定会被执行,System.gc 和 System.runFinalization 增加终结方法的执行机会,不应该依赖终结方法来更新重要的持久状态。System.runFinalizersOnExit 和 Runtime.runFinalizersOnExit 声称保证终结方法被执行,有致命缺陷被废弃,内部匿名类终结方法守卫者,防止子类的终结方法未能调用 super.finalize)

对于所有对象都能用的方法

  1. 覆盖 equals 时遵守能用约定