第4章类和接口54
条目15:最小化类和成员的可访问性54
条目16:在公有类中,使用访问器方法,
而不使用公有的字段57
条目17:使可变性最小化58
条目18:组合优先于继承63
条目19:要么为继承而设计并提供文档
说明,要么就禁止继承68
条目20:与抽象类相比,优先选择接口72
条目21:为传诸后世而设计接口75
条目22:接口仅用于定义类型77
条目23:优先使用类层次结构而不是
标记类78
条目24:与非静态成员类相比,优先选择
静态成员类81
条目25:将源文件限制为单个顶层类83
第5章泛型85
条目26:不要使用原始类型85
条目27:消除unchecked类型的警告89
条目28:列表优先于数组91
条目29:首选泛型类型94
条目30:首选泛型方法98
条目31:使用有限制的通配符增加API的
灵活性100
条目32:谨慎混用泛型和可变参数105
条目33:考虑类型安全的异构容器108
第6章枚举和注解113
条目34:使用enum代替int常量113
条目35:使用实例字段代替序号121
条目36:使用EnumSet代替位域122
条目37:不要以序号作为索引,使用
EnumMap代替123
条目38:使用接口模拟可扩展的枚举127
条目39:与命名模式相比首选注解130
条目40:始终使用Override注解136
条目41:使用标记接口来定义类型138
第7章Lambda表达式和流140
条目42:与匿名类相比,优先选择Lambda
表达式140
条目43:与Lambda表达式相比,优先选择
方法引用143
条目44:首选标准的函数式接口144
条目45:谨慎使用流147
条目46:在流中首选没有副作用的
函数152
条目47:作为返回类型时,首选Collection
而不是Stream156
条目48:将流并行化时要谨慎160
第8章方法163
条目49:检查参数的有效性163
条目50:必要时进行保护性复制165
条目51:仔细设计方法签名168
条目52:谨慎使用重载170
条目53:谨慎使用可变参数174
条目54:返回空的集合或数组,而不是
null176
条目55:谨慎返回Optional177
条目56:为所有导出的API元素编写文档
注释181
第9章通用编程186
条目57:最小化局部变量的作用域186
条目58:与传统的for循环相比,首选
for-each循环188
条目59:了解并使用类库190
条目60:如果需要精确的答案,避免使用
float和double192
条目61:首选基本类型,而不是其
封装类194
条目62:如果其他类型更适合,就不要使用
字符串196
条目63:注意字符串拼接操作的性能198
条目64:通过接口来引用对象198
条目65:与反射相比,首选接口200
条目66:谨慎使用本地方法202
条目67:谨慎进行优化203
条目68:遵循普遍接受的命名惯例205
第10章异常208
条目69:异常机制应该仅用于异常的
情况208
条目70:对于可恢复的条件,使用检查型
异常;对于编程错误,使用运行时
异常210
条目71:避免不必要地使用检查型
异常211
条目72:优先使用标准异常212
条目73:抛出适合于当前抽象的异常214
条目74:将每个方法抛出的所有异常都写在
文档中215
条目75:将故障记录信息包含在详细
信息中216
条目76:努力保持故障的原子性218
条目77:不要忽略异常219
第11章并发220
条目78:同步对共享可变数据的访问220
条目79:避免过度同步223
条目80:与线程相比,首选执行器、
任务和流228
条目81:与wait和notify相比,首选
高级并发工具229
条目82:将线程安全性写在文档中233
条目83:谨慎使用延迟初始化235
条目84:不要依赖线程调度器237
第12章序列化239
条目85:优先选择其他序列化替代方案239
条目86:在实现Serializable接口时要
特别谨慎241
条目87:考虑使用自定义的序列化形式243
条目88:保护性地编写readObject
方法248
条目89:对于实例受控的类,首选枚举类型
而不是readResolve253
条目90:考虑使用序列化代理代替序列化
实例256
附录与第2版中条目的对应关系259
参考文献262