lovebet体育Effective java 读书笔记。Effective Java 读书笔记

2. 遇到多个构造器时要考虑用构建器,2. 遇到多个构造器时要考虑用构建器

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

静态方法的
优势

  1. 发号,便于理解
  2. 不要每次都创造一个新目标
  3. 得回来路的其余子类型对象
  4. 始建参数化类型实例的当儿,代码更加从简

缺点

  1. 好像设无含共有或给保障之构造器,就未能够被子类化
  2. 不如他人静态方法无分

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

静态方法的
优势

  1. 起号,便于理解
  2. 并非每次都创造一个新目标
  3. 可以返回路的外子类型对象
  4. 缔造参数化类型实例的下,代码更加简明

缺点

  1. 好像设不包含共有或受保障之构造器,就非可知被子类化
  2. 与其说他人静态方法无区别

2. 碰面多单构造器时如考虑就此构建器

2. 赶上多独构造器时一旦考虑就此构建器

3. 所以个人构造器或者枚举类型强化Singleton属性

  • 枚举类实现其实简单了private类型的构造函数
  • 枚举类的地段(field)其实是相应的enum类型的一个实例对象
//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

3. 为此个人构造器或者枚举类型强化Singleton属性

  • 枚举类实现其实简单了private类型的构造函数
  • 枚举类的地区(field)其实是对应的enum类型的一个实例对象
//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

4. 经过个人构造器强化不可实例化的力量

4. 经个人构造器强化不可实例化的力

5. 避免创建不必要之目标

5. 幸免创建不必要的靶子

6. 解除过期的目标引用

6. 革除过期的靶子引用

7. 避免使用 finalizer 方法

7. 幸免采用 finalizer 方法

8. 更写 equals 时请遵通用约定

8. 还写 equals 时请遵守通用约定

9. 再度写 equals 时究竟要更写 hashCode

9. 重新写 equals 时总要再次写 hashCode

10. 直重写 toString

10. 老重写 toString

11. 竞重写 clone

11. 严谨重写 clone

12. 考虑实现 Comparable 接口

12. 设想实现 Comparable 接口

13. 使类和分子的但访问性最小化

13. 使类和分子的而是访问性最小化

14. 于一齐产生像样中使用访问方法要不共有域

使用getter setter 方法

14. 以并发生接近吃利用访问方法而未共有域

使用getter setter 方法

15. 设可变性最小化

每个实例中蕴含的兼具信息都得于创造该实例的时段便提供,并以对象的全部生命周期(lifetime)內固定不变换

15. 若是可变性最小化

每个实例中寓的具备信息都必须在开创该实例的上便提供,并在靶的一体生命周期(lifetime)內固定不移

16. 顺应优先给继续

后续打破了封装性

16. 适合优先为继续

继续打破了封装性

17. 或者也继承而规划,并提供文档说明,要么就不准继续

17. 要么也连续而规划,并提供文档说明,要么就算不准继续

18. 接口优于抽象类

幸存的好像可好容易被更新,以贯彻新的接口
接口时定义mixin(混合类型) 的不错选择
接口允许我们组织非层次接口的项目框架

18. 接口优于抽象类

幸存的类似可老爱给更新,以落实新的接口
接口时定义mixin(混合类型) 的良选择
接口允许我们组织非层次接口的种类框架

19. 接口就用于定义类型

常量接口不饱次极,常量接口是对接口的不行使用

19. 接口就用于定义类型

常量接口不饱次法,常量接口是针对接口的不成使用

20. 类层次优于标签类

20. 类层次优于标签类

21. 就此函数对象表示策

21. 因此函数对象表示策

22. 预先考虑静态成员类

嵌套类(nested class)

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

除此之外第一种外 其他三栽于名中类

22. 优先考虑静态成员类

嵌套类(nested class)

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

除第一种植外 其他三种被称呼中类

23. 要不要在新代码中以原生态项目

23. 请求不要以初代码中采取原来生态项目

24. 散非受检警告

24. 除掉非受检警告

25. 列表优先让数组

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

25. 列表优先让数组

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

26. 先行考虑泛型

26. 事先考虑泛型

27. 优先考虑泛型方法

27. 预先考虑泛型方法

28. 运有限制通配符来提升API的油滑

28. 以有限制通配符来提升API的灵活性

29. 事先考虑类型安全的异构容器

29. 预先考虑类型安全的异构容器

30. 用 enum 代替 int 常量

枚举天生就不可变

30. 用 enum 代替 int 常量

枚举天生就不可变

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; }
}

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; }
}

32. 用 EnumSet 代替位域

位域(bit field) 用OR个运算将几只常量合并及一个凑中

32. 就此 EnumSet 代替位域

位域(bit field) 用OR各类运算将几只常量合并到一个集合中

33. 据此 EnumMap 代替序数索引

33. 于是 EnumMap 代替序数索引

34. 之所以接口模拟可伸缩的枚举

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

35. 注优先让命名模式

35. 诠释优先给命名模式

36. 坚称运用 Override 注解

36. 咬牙用 Override 注解

37. 于是标记接口定义类型

符接口 (marker interface)
没有含方法声明的接口,而独自是指明一个近乎实现了具备某种属性的接口

37. 据此标记接口定义类型

号接口 (marker interface)
没有包含方法声明的接口,而止是指明一个近似实现了具有某种属性的接口

38. 反省参数的可行

38. 检查参数的有效性

39. 必备时进行保护醒拷贝

39. 必需常常开展保护醒拷贝

40. 小心设计方法签名

  • 小心地挑方式的名
  • 并非过于追求提供便民的道
  • 避了长的参数列表

40. 小心翼翼设计方式签名

  • 小心谨慎地选方式的称谓
  • 不要过分追求提供好的法子
  • 避了长的参数列表

41. 慎之所以重载

41. 慎之所以重载

42. 慎为此而易参数

42. 慎就此而转移参数

43. 返回零长度的数组或者聚众,而未是null

43. 返零长度的数组或者聚众,而不是null

44. 吧拥有导出的API元素编写文档注释

44. 乎所有导出的API元素编写文档注释

45. 以有变量的作用域最小化

  • 就此到当宣称
  • 宣示时犹应有包含一个初始化表达式

45. 用有些变量的作用域最小化

  • 故此到以声明
  • 宣称时都当包含一个初始化表达式

46. for-each 巡回优先给人情的 for 循环

46. for-each 循环往复优先受人情的 for 循环

47. 叩问与动类库

47. 摸底及下类库

48. 只要急需规范的答案,请避免采用 float 和 double

利用 BigDecimal、int、long 进行货币计

48. 要是急需规范的答案,请避免下 float 和 double

动用 BigDecimal、int、long 进行货币计

49. 着力型优先让装箱基本类型

49. 中心项目优先给装箱基本项目

50. 使另外门类又确切,则尽量避免使用字符串

  • 字符串不相符代替其他的值类型
  • 字符串不入代替枚举类型
  • 字符串不称代替聚集类型
  • 字符串也无符合代替能力表 (capabilities)

50. 若其他门类又确切,则尽量避免使用字符串

  • 字符串不合乎代替其他的值类型
  • 字符串不入代替枚举类型
  • 字符串不抱代替聚集类型
  • 字符串也无符合代替能力表 (capabilities)

51. 警醒字符串连接的性

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

52. 经过接口引用对象

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

52. 经接口引用对象

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

53. 接口优先给反射机制

映的害处

  • 丧失了编译时类型检查的好处
  • 尽反射访问所欲之代码笨拙和长
  • 特性损失

53. 接口优先为反射机制

照的弊端

  • 错失了编译时类型检查的功利
  • 施行反射访问所用之代码笨拙和长
  • 性能损失

54. 竞地以当地方法

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

54. 小心翼翼地采取当地方法

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

55. 严谨之进展优化

55. 小心的开展优化

56. 守普遍接受的命名惯例

56. 遵循普遍接受的命名惯例

57. 但对大的状才以好

57. 特对老的景才祭非常

58. 对可复原的状态用受检异常,对编程错误采取运行时生

老三栽而丢来荒谬(throwable)

  • 受检的可怜(checked exception) 希望调用者能正好地东山再起
  • 运转时特别 (runtime exception) 前提违例 (precondition violation)
  • 错误(error)

58. 对准可还原的情事以受检异常,对编程错误使用运行时很

老三种而丢来荒谬(throwable)

  • 受检的酷(checked exception) 希望调用者能方便地还原
  • 运作时杀 (runtime exception) 前提违例 (precondition violation)
  • 错误(error)

59. 幸免不必要地动受检的坏

59. 避免不必要地使用受检的非常

60. 预采取标准的异常

60. 先期利用专业的十分

61. 抛来和虚空相呼应之不胜

61. 抛来与虚幻相呼应之充分

62. 每个方法抛来之那个且要发出文档

62. 每个方法抛来之不行都如有文档

63. 在细节消息备受蕴含能捕获失败的音

63. 在细节消息受到涵盖能捕获失败的消息

64. 努力一旦失败保持原子性

砸方法调用应该使对象保障在为调用之前的状态

64. 着力而失败保持原子性

未果方法调用应该要是对象保障以为调用之前的状态

65. 决不忽视异常

65. 绝不忽略异常

66. 联名访问共享的可变数据

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

67. 免超负荷同步

67. 避免超负荷同步

68. executor 暨 task 优先受线程

68. executor 以及 task 优先让线程

69. 产出工具优先为wait 和 notify

69. 油然而生工具优先受wait 和 notify

70. 线程安全性的文档化

70. 线程安全性的文档化

71. 慎用延迟初始化

71. 慎据此延迟初始化

72. 决不因线程调度器

72. 绝不借助线程调度器

73. 幸免使用线程组

73. 幸免使用线程组

74. 谨慎地实现 Serializable 接口

74. 谨慎地贯彻 Serializable 接口

75. 考虑采取由定义序列化形式

75. 考虑采用从定义序列化形式

76. 保护性地修 readObject 方法

76. 保护性地修 readObject 方法

77. 对于实例控制,枚举类型优先为 readResolve

77. 于实例控制,枚举类型优先受 readResolve

78. 考虑用序列化代理代替序列化实例

也而序列化的类设计一个民用的静态嵌套类,精确地表示他围类的实例的逻辑状态。这个嵌套类吃称作序列化代理(serialization
proxy)

78. 考虑用序列化代理代替序列化实例

为而序列化的近乎设计一个私有的静态嵌套类,精确地表示他围类的实例的逻辑状态。这个嵌套类吃如作序列化代理(serialization
proxy)