第11章:序列化

74. 谨慎地实现Serializable接口

实现序列化接口带来的问题:

灵活性:实现序列化接口会导致程序发布后灵活性变差(导出后要永远支持这种序列化形式)。

安全性和BUG:增加了BUG和安全漏洞的可能性:反序列化机制是一个“隐蔽的构造器”。依靠默认的反序列化机制,很容易使对象的约束关系遭到破坏,以及遭到非法访问

测试负担:随着类发型新的版本,相关的测试负担也增加了。

最佳实践:为了继承而设计的类,应尽可能少地去实现序列化接口。

75. 考虑使用自定义序列化形式

76. 保护性地编写readObeject方法

针对74条中的安全性问题,可以使用readO......

第10章:并发

这一章还是比较简单。因为之前看过并发编程实战这本书的内容。如果需要完整了解并发,还是需要看下那本书。

66. 同步访问共享的可变数据

67. 避免过度同步

在同步区域内做尽量少的工作。例如调用外星方法以及引用可变对象都会造成线程不安全。

68. executor和task优先于线程

自己去通过Thread编写多线程任务是不太好的,因为要考虑很多细节。采用并发包中的ExecutorService来管理线程任务是最佳实践

69. 并发工具优先于wait和notify

并发操作,都优先使用并发包里面的工具和数据结构。

70. 线程安全性的文档化

提供一些线程......

第8章:通用程序设计

45. 将局部变量的作用域最小化

在第一次使用它的地方声明

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

性能更好;

避免使用iterator时候产生的一些迭代问题

以下情况无法使用for-each

过滤:需要在遍历时删除元素

转换

平行迭代

47. 了解和使用类库

避免重复造轮子

48. 需要精确的答案,避免使用float和double

货币计算可以使用BigDecimal、int和long

49. 基本类型优于装箱基本类型

避免对象的NullPointerException方法,同时性能也会好点

50. 如果其他类......

第7章:方法

38.检查参数有效性

在编程中养成对参数做检查的习惯

39. 必要时进行保护性拷贝

对可变对象的引用可能造成错误的答案。这时候可以考虑使用保护性拷贝的方式。例如重新使用构造器生成对象。

40. 谨慎设计方法签名

方法名要易于理解;避免过长的参数列表。

参数类型优先使用接口;

boolean参数优先使用枚举类型

41. 慎用重载

最佳实践:永远不要导出两个具有相同参数的重载方法

42. 慎用可变参数

43. 返回零长度的数组或者集合,而不是null

返回类型为数组或集合的方法没理由返回null,避免上层还需要对null做额外的处理

......

第六章:枚举和注解

30. 用enum代替int常量

枚举是单例的。类型检查等措施保证其安全可靠。

枚举类中需要引用自有的枚举值做判断,建议使用策略枚举。即将引用枚举值的行为方法定义成一个内部枚举类,传递给枚举类的构造器中。例子见书P135。策略枚举是策略模式的一种延伸。

31. 用实例代替序数

枚举是有个int值序数来维护顺序的。但是避免用这ordinal()方法来获取序数。该方法仅在设计像EnumSet和EnumMap这样的类的时候才使用

32. 用EnumSet来代替位域

有时候需要将多个枚举值按照位运算的方式来做并交的操作,这个可以交个EnumSet来做,其本身内部实现也是......