4. 由此个人构造器强化不可实例化的能力,2. 相遇几个构造器时要考虑用构建器万博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类型的构造函数
  • 枚举类的域(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)