lovebet体育读书笔记,读书笔记

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)