1. 设想用静态工厂方法代替构造器伟德国际1946,4. 通过个人构造器强化不可实例化的力量

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

静态方法的
优势

  1. 有名称,便于领会
  2. 并非每便都创立贰个新对象
  3. 能够重临类型的其他子类型对象
  4. 创制参数化类型实例的时候,代码越发从简

缺点

  1. 类假诺不含有共有或然受保障的构造器,就不能够被子类化
  2. 与其说外人静态方法无区别

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

静态方法的
优势

  1. 知名称,便于通晓
  2. 决不每一回都成立2个新对象
  3. 能够再次来到类型的任何子类型对象
  4. 创造参数化类型实例的时候,代码越发简明

缺点

  1. 类即便不含有共有大概受有限支撑的构造器,就无法被子类化
  2. 与其余人静态方法无差异

2. 相遇八个构造器时要考虑用营造器

2. 蒙受四个构造器时要考虑用营造器

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

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)

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

除外第2种外 别的三种被称作内部类

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. 用实例域代替序数

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

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 田野先生) 用O中华V位运算将多少个常量合并到二个凑合中

32. 用 EnumSet 代替位域

位域(bit 田野同志) 用O猎豹CS7位运算将多少个常量合并到三个聚集中

33. 用 EnumMap 代替序数索引

33. 用 EnumMap 代替序数索引

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

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

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

35. 诠释优先于命超格局

36. 水滴石穿利用 Override 申明

36. 咬牙运用 Override 注脚

37. 用标记接口定义类型

标记接口 (marker interface)
没有包蕴方法评释的接口,而只是指贝拉米(Bellamy)(Nutrilon)个类完结了全数某种属性的接口

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. 先期利用规范的越发

伟德国际1946,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. 考虑用连串化代理代替系列化实例

为可类别化的类设计1个私家的静态嵌套类,精确地表示外围类的实例的逻辑状态。这些嵌套类被称作种类化代理(serialization
proxy)

相关文章