Effective java 读书笔记

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

静态方法的
优势

  1. 知名称,便于理解
  2. 绝不每一遍都创制一个新目标
  3. 可以回去类型的其它子类型对象
  4. 制造参数化类型实例的时候,代码更加简明

缺点

  1. 类假如不含有共有或者受保障的构造器,就不可能被子类化
  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

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

5. 防止创制不必要的目的

6. 免去过期的靶子引用

7. 防止采纳 finalizer 方法

8. 重写 equals 时请坚守通用约定

9. 重写 equals 时总要重写 hashCode

10. 始终重写 toString

11. 兢兢业业重写 clone

12. 设想实现 Comparable 接口

13. 使类和成员的可访问性最小化

14. 在共有类中运用访问方法而非共有域

使用getter setter 方法

15. 使可变性最小化

每个实例中包含的拥有信息都必须在成立该实例的时候就提供,并在目的的上上下下生命周期(lifetime)內固定不变

16. 合乎优先于继续

此起彼伏打破了封装性

17. 或者为继续而计划,并提供文档表明,要么就不准继续

18. 接口优于抽象类

幸存的类可以很容易被更新,以落实新的接口
接口时定义mixin(混合类型) 的脍炙人口选取
接口允许大家协会非层次接口的类型框架

19. 接口只用于定义类型

常量接口不满足次口径,常量接口是对接口的不成使用

20. 类层次优于标签类

21. 用函数对象表示策略

22. 预先考虑静态成员类

嵌套类(nested class)

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

除去第一种外 其他三种被称之为内部类

23. 请不要在新代码中行使原生态项目

24. 消除非受检警告

25. 列表优先于数组

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

26. 事先考虑泛型

27. 优先考虑泛型方法

28. 使用有限制通配符来提高API的灵活性

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

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

32. 用 EnumSet 代替位域

位域(bit field) 用OR位运算将多少个常量合并到一个聚集中

33. 用 EnumMap 代替序数索引

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

35. 诠释优先于命超级模特式

36. 坚贞不屈不懈采纳 Override 声明

37. 用标记接口定义类型

标志接口 (marker interface)
没有包含方法表明的接口,而只是指明一个类实现了所有某种属性的接口

38. 检查参数的有用

39. 必需时开展敬重醒拷贝

40. 审慎设计方法签名

  • 当心地挑选格局的称谓
  • 不用过分追求提供有利的点子
  • 避免过长的参数列表

41. 慎用重载

42. 慎用可变参数

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

44. 为保有导出的API元素编写文档注释

45. 将一部分变量的效率域最小化

  • 用到在宣称
  • 声称时都应有包含一个起先化表达式

46. for-each 循环往复优先于传统的 for 循环

47. 询问和应用类库

48. 虽然需要规范的答案,请避免采取 float 和 double

运用 BigDecimal、int、long 进行货币总计

49. 主干类型优先于装箱基本项目

50. 假使其他连串更恰当,则尽量制止使用字符串

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

51. 警惕字符串连接的性质

52. 经过接口引用对象

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

53. 接口优先于反射机制

反射的弊病

  • 痛失了编译时类型检查的益处
  • 推行反射访问所急需的代码笨拙和冗长
  • 性能损失

54. 小心翼翼地利用当地点法

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

55. 小心的开展优化

56. 听从普遍接受的命名惯例

57. 只针对分外的气象才使用分外

58. 对可还原的图景接纳受检分外,对编程错误接纳运行时非凡

二种可抛出错误(throwable)

  • 受检的至极(checked exception) 希望调用者能适用地光复
  • 运行时特别 (runtime exception) 前提违例 (precondition violation)
  • 错误(error)

59. 防止不必要地采取受检的老大

60. 事先采用标准的这么些

61. 抛出与虚幻相对应的不行

62. 各个方法抛出的不得了都要有文档

63. 在细节信息中含有能捕获失败的音讯

64. 竭力使失败保持原子性

挫折方法调用应该使对象保障在被调用在此之前的情形

65. 不用忽视非凡

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

67. 防止过度同步

68. executor 和 task 优先于线程

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

70. 线程安全性的文档化

71. 慎用延迟伊始化

72. 不用借助线程调度器

73. 制止使用线程组

74. 谨慎地促成 Serializable 接口

75. 考虑使用自定义体系化形式

76. 敬爱性地编写 readObject 方法

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

78. 考虑用体系化代理代替连串化实例

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

相关文章