2. 相遇四个构造器时要考虑用创设器,1. 思考用静态工厂方法代替构造器万博manbetx客户端

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类型的构造函数
  • 枚举类的域(田野)其实是对应的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)) 用O中华V位运算将多少个常量合併到三个集聚中

32. 用 EnumSet 取代位域

位域(bit 田野(field)) 用OWrangler位运算将多少个常量合併到三个成团中

33. 用 EnumMap 代替序数索引

33. 用 EnumMap 取代序数索引

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

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

35. 评释优先于命有名的模特式

35. 注解优先于命有名的模特式

36. 咬牙使用 Override 评释

36. 持之以恒选用 Override 申明

37. 用标志接口定义类型

标志接口 (marker interface)
未有满含方法申明的接口,而只是指可瑞康(Karicare)个类完成了富有某种属性的接口

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)