读书笔记

一. 设想用静态工厂方法替代构造器

静态方法的
优势

  1. 著名称,便于明白
  2. 毫无每一趟都创建三个新对象
  3. 能够重回类型的其余子类型对象
  4. 始建参数化类型实例的时候,代码特别简明

缺点

  1. 类若是不含有共有可能受保证的构造器,就不可能被子类化
  2. 与别的人静态方法无区别

1. 思量用静态工厂方法取代构造器

静态方法的
优势

  1. 出名称,便于精晓
  2. 绝不每趟都创建几个新指标
  3. 能够回到类型的别的子类型对象
  4. 创设参数化类型实例的时候,代码尤其从简

缺点

  1. 类如若不带有共有也许受保险的构造器,就不可能被子类化
  2. 与其说旁人静态方法无不一致

贰. 相逢七个构造器时要驰念用构建器

二. 境遇多个构造器时要思考用创设器

3. 用个人构造器或然枚举类型强化Singleton属性

  • 枚举类达成其实轻易了private类型的构造函数
  • 枚举类的域(田野(field))其实是相应的enum类型的1个实例对象
//Define what the singleton must do.
public interface MySingleton {
    public void doSomething();
}
private enum Singleton implements MySingleton {
    /**
     * The one and only instance of the singleton.
     *
     * By definition as an enum there MUST be only one of these and it is inherently thread-safe.
     */
    INSTANCE {
                @Override
                public void doSomething() {
                    // What it does.
                }
            };
}
public static MySingleton getInstance() {
    return Singleton.INSTANCE;
}

https://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version

三. 用个人构造器可能枚举类型强化Singleton属性

  • 枚举类实现其实轻易了private类型的构造函数
  • 枚举类的域(田野先生)其实是相应的enum类型的2个实例对象
//Define what the singleton must do.
public interface MySingleton {
    public void doSomething();
}
private enum Singleton implements MySingleton {
    /**
     * The one and only instance of the singleton.
     *
     * By definition as an enum there MUST be only one of these and it is inherently thread-safe.
     */
    INSTANCE {
                @Override
                public void doSomething() {
                    // What it does.
                }
            };
}
public static MySingleton getInstance() {
    return Singleton.INSTANCE;
}

https://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version

四. 因而个人构造器强化不可实例化的才干

四. 透过个人构造器强化不可实例化的技艺

5. 制止创造不供给的目的

5. 幸免创设不供给的对象

六. 拔除过期的靶子引用

陆. 去掉过期的指标引用

七. 防止使用 finalizer 方法

七. 防止选取 finalizer 方法

八. 重写 equals 时请遵从通用约定

八. 重写 equals 时请服从通用约定

九. 重写 equals 时总要重写 hashCode

9. 重写 equals 时总要重写 hashCode

拾. 一味重写 toString

10. 始终重写 toString

11. 小心重写 clone

1一. 谨言慎行重写 clone

12. 思量达成 Comparable 接口

1二. 惦记完毕 Comparable 接口

1叁. 使类和分子的可访问性最小化

一三. 使类和成员的可访问性最小化

14. 在共有类中利用访问方法而非共有域

使用getter setter 方法

1肆. 在共有类中央银行使访问方法而非共有域

使用getter setter 方法

1五. 使可变性最小化

各类实例中含有的兼具消息都不能够不在开立该实例的时候就提供,并在对象的全体生命周期(lifetime)內固定不改变

一伍. 使可变性最小化

各种实例中含有的具备消息都不能够不在创建该实例的时候就提供,并在对象的壹体生命周期(lifetime)內固定不改变

1陆. 顺应优先于继续

继续打破了封装性

16. 契合优先于继续

此伏彼起打破了封装性

壹7. 也许为继续而规划,并提供文书档案表明,要么就不准继续

一7. 还是为持续而规划,并提供文档表达,要么就不准继续

1八. 接口优于抽象类

幸存的类能够很轻松被更新,以完结新的接口
接口时定义mixin(混合类型) 的非凡选用
接口允许大家组织非档案的次序接口的体系框架

1八. 接口优于抽象类

幸存的类能够很轻便被更新,以促成新的接口
接口时定义mixin(混合类型) 的理想采纳
接口允许大家协会非等级次序接口的品类框架

1九. 接口只用于定义类型

常量接口不满意次口径,常量接口是对接口的贰流使用

1九. 接口只用于定义类型

常量接口不知足次口径,常量接口是对接口的不佳使用

20. 类档案的次序优于标签类

20. 类档案的次序优于标签类

二壹. 用函数对象表示战术

21. 用函数对象表示计策

2二. 预先思量静态成员类

嵌套类(nested class)

  • 静态成员类
  • 非静态成员类
  • 匿名类
  • 局部类

除却第三种外 别的两种被称为内部类

2二. 事先考虑静态成员类

嵌套类(nested class)

  • 静态成员类
  • 非静态成员类
  • 匿名类
  • 局部类

除此而外第二种外 其余两种被叫作内部类

二三. 请不要在新代码中动用原生态类型

二叁. 请不要在新代码中应用原生态项目

24. 消除非受检警告

贰肆. 清除非受检警告

25. 列表优先于数组

数组与泛型比较,数组是协变的(covariant)、具体化的(reified)

2五. 列表优先于数组

数组与泛型相比,数组是协变的(covariant)、具体化的(reified)

二陆. 开始的一段时期考虑泛型

二陆. 事先思量泛型

二七. 优先思虑泛型方法

二柒. 开始的一段时期思量泛型方法

2八. 采纳有限制通配符来进步API的弹无虚发

2八. 应用有限制通配符来进步API的面面俱到

2玖. 优先考虑类型安全的异构容器

2玖. 先行思量类型安全的异构容器

30. 用 enum 代替 int 常量

枚举天生就不可变

30. 用 enum 代替 int 常量

枚举天生就不可变

3壹. 用实例域取代序数

并非根据枚举的序数导出与关系的值,而是要将它保存在2个实例域

public enum Ensemble {
  SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
  SEXTET(6), ETPTET(7), OCTET(8), DOUBLE_QUARTET(8)

  private final int numberOfMusicians;
  Ensemble(int size) { this.numberOfMusicians = size; }
  public int numberOfMusicians() { return numberOfMusicians; }
}

31. 用实例域代替序数

永不根据枚举的序数导出与关系的值,而是要将它保存在贰个实例域

public enum Ensemble {
  SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
  SEXTET(6), ETPTET(7), OCTET(8), DOUBLE_QUARTET(8)

  private final int numberOfMusicians;
  Ensemble(int size) { this.numberOfMusicians = size; }
  public int numberOfMusicians() { return numberOfMusicians; }
}

3二. 用 EnumSet 替代位域

位域(bit 田野) 用OTiggo位运算将多少个常量合并到3个集合中

3二. 用 EnumSet 取代位域

位域(bit 田野同志) 用O福特Explorer位运算将几个常量合并到叁个会面中

3三. 用 EnumMap 代替序数索引

3三. 用 EnumMap 取代序数索引

3肆. 用接口模拟可伸缩的枚举

34. 用接口模拟可伸缩的枚举

35. 讲明优先于命超形式

3五. 解说优先于命有名的模特式

3陆. 坚持不渝使用 Override 表明

3六. 坚称采取 Override 表明

叁七. 用标识接口定义类型

标志接口 (marker interface)
未有包罗方法阐明的接口,而只是指美赞臣个类完结了独具某种属性的接口

37. 用标识接口定义类型

标识接口 (marker interface)
未有包涵方法表明的接口,而只是指明一(Wissu)(Dumex)个类完毕了富有某种属性的接口

3捌. 检查参数的有效

3八. 检查参数的卓有成效

3九. 不可缺少时开始展览敬服醒拷贝

3九. 必要时开始展览珍贵醒拷贝

40. 战战兢兢设计方法签字

  • 谨慎地接纳方式的称谓
  • 无须过度追求提供便利的法子
  • 制止过长的参数列表

40. 审慎设计方法签字

  • 战战兢兢地挑选方式的名号
  • 无须过度追求提供便宜的方式
  • 幸免过长的参数列表

4一. 慎用重载

四一. 慎用重载

4二. 慎用可变参数

42. 慎用可变参数

4三. 回去零长度的数组也许聚众,而不是null

四3. 回到零长度的数组可能聚众,而不是null

4四. 为具备导出的API成分编写文书档案注释

4肆. 为全数导出的API成分编写文档注释

4五. 将有些变量的成效域最小化

  • 用到在表明
  • 宣称时都应有包括贰个开首化表达式

四5. 将部分变量的成效域最小化

  • 用到在宣称
  • 扬言时都应该包蕴2个开头化表明式

4六. for-each 巡回优先于古板的 for 循环

四陆. for-each 巡回优先于古板的 for 循环

四七. 打探和选取类库

四7. 叩问和应用类库

4八. 若是急需典型的答案,请防止使用 float 和 double

动用 BigDecimal、int、long 实行货币总括

4八. 即便急需规范的答案,请防止使用 float 和 double

运用 BigDecimal、int、long 实行货币总括

4玖. 主干项目优先于装箱基本项目

4⑨. 中坚项目优先于装箱基本类型

50. 举个例子其余体系更贴切,则尽量防止使用字符串

  • 字符串不吻合取代别的的值类型
  • 字符串不切合代替枚举类型
  • 字符串不相符代替集中类型
  • 字符串也不吻合代替本事表 (capabilities)

50. 若是其余项目更伏贴,则尽量防止使用字符串

  • 字符串不吻合替代别的的值类型
  • 字符串不切合替代枚举类型
  • 字符串不相符代替集中类型
  • 字符串也不吻合代替技艺表 (capabilities)

51. 不容忽视字符串连接的性质

5壹. 小心字符串连接的特性

52. 通过接口引用对象

// good
List<Subscriber> subscribers = new Vector<Subscriber>()
// bad
Vector<Subscriber> subscribers = new Vector<Subscriber>()

5二. 经过接口引用对象

// good
List<Subscriber> subscribers = new Vector<Subscriber>()
// bad
Vector<Subscriber> subscribers = new Vector<Subscriber>()

5三. 接口优先于反射机制

反射的害处

  • 丧失了编写翻译时类型检查的好处
  • 试行反射访问所需求的代码迟钝和冗长
  • 品质损失

伍三. 接口优先于反射机制

反射的害处

  • 错失了编写翻译时类型检查的补益
  • 施行反射访问所需求的代码迟钝和冗长
  • 天性损失

54. 小心地使用当地点法

Java Native Interface (JNI) 允许调用本地点法(native method)

54. 战战兢兢地行使当地方法

Java Native Interface (JNI) 允许调用当地点法(native method)

55. 行事极为谨慎的展开优化

5伍. 严俊的实行优化

5陆. 依照普及接受的命名惯例

56. 死守遍布接受的命名惯例

五7. 只针对分外的景况才使用极度

57. 只针对极度的事态才使用极其

5八. 对可还原的意况使用受检分外,对编制程序错误使用运维时充足

二种可抛出错误(throwable)

  • 受检的不得了(checked exception) 希望调用者能适用地重振旗鼓
  • 运作时极其 (runtime exception) 前提违例 (precondition violation)
  • 错误(error)

5八. 对可还原的境况使用受检非常,对编制程序错误使用运维时足够

三种可抛出错误(throwable)

  • 受检的要命(checked exception) 希望调用者能确切地还原
  • 运作时这一个 (runtime exception) 前提违例 (precondition violation)
  • 错误(error)

5玖. 幸免不须求地使用受检的13分

5玖. 防止不须求地选取受检的不胜

60. 刚开始阶段利用正式的充裕

60. 事先使用标准的要命

6一. 抛出与虚幻相呼应的可怜

陆一. 抛出与虚空相呼应的特别

62. 各样方法抛出的13分都要有文书档案

62. 各样方法抛出的百般都要有文书档案

63. 在细节音信中包含能捕获失利的音信

陆三. 在细节音讯中涵盖能捕获战败的新闻

6四. 开足马力使退步保持原子性

退步方法调用应该使对象保险在被调用在此以前的情事

6四. 大力使战败保持原子性

停业方法调用应该使对象保险在被调用在此以前的情景

六五. 决不忽略至极

陆五. 永不忽视万分

6陆. 同台访问共享的可变数据

66. 协助实行访问共享的可变数据

陆7. 制止过度同步

6七. 防止过度同步

6八. executor 和 task 优先于线程

68. executor 和 task 优先于线程

6九. 面世工具优先于wait 和 notify

6九. 现身工具优先于wait 和 notify

70. 线程安全性的文书档案化

70. 线程安全性的文书档案化

7一. 慎用延迟初步化

7一. 慎用延迟开头化

72. 不要借助线程调节器

7二. 并非借助线程调治器

73. 幸免使用线程组

7三. 防止使用线程组

7四. 谨慎地促成 Serializable 接口

7四. 谨慎地贯彻 Serializable 接口

7伍. 思索选拔自定义连串化情势

7五. 思量接纳自定义种类化方式

76. 爱戴性地编写 readObject 方法

7陆. 爱慕性地编写 readObject 方法

77. 对此实例调整,枚举类型优先于 readResolve

7七. 对于实例调整,枚举类型优先于 readResolve

7八. 思量用种类化代理代替连串化实例

为可连串化的类设计2个民用的静态嵌套类,准确地意味着外围类的实例的逻辑状态。那些嵌套类被称作种类化代理(serialization
proxy)

7八. 思考用类别化代理替代连串化实例

为可系列化的类设计二个私有的静态嵌套类,正确地代表外围类的实例的逻辑状态。那么些嵌套类被称作系列化代理(serialization
proxy)