Java|Effective Java 在工作中的应用总结( 三 )


若一个方法返回 null 而不是零长度的数组或者集合 , 开发者需要加入 != null 的检查 , 有时容易忘记出错 , 报NullpointerException 。
说到此 , 笔者想额外提一下 Optional 。 网络上有很多关于 Optional 和 null 的使用讨论 。 Optional 允许调用者继续一系列流畅的方法调用(e.g. stream.getFirst().orElseThrow(() -new MyFancyException())) 。 以下为笔者整理的观点 。
/** 推荐:提示返回值可能为空 。 */public OptionalFoofindFoo(String id);/** * 中立:稍显笨重 * 可考虑 doSomething(\"bar\" null); * 或者重载 doSomething(\"bar\"); 和 doSomething(\"bar\" \"baz\"); **/public Foo doSomething(String id OptionalBarbarOptional);/** * 不推荐:违背 Optional 设计的目的 。* 当 Optional 值缺省时 , 一般有3种处理方法:1)提供代替的值;2)调用方法提供代替的值;3)抛出异常 * 这些处理方法可以在字段初始或赋值的时候处理 。**/public class Book { private ListPagespages; private OptionalIndexindex;/** * 不推荐:违背 Optional 设计的目的 。* 若为缺省值 , 可直接不放入列表中 。**/ListOptionalFoo 五 通用程序设计篇 1 如果需要精确的答案 , 请避免使用float和double
float 和 double 类型主要用于科学工程计算 。 它们执行二进制浮点运算 , 为了在数值范围上提供较为精准的快速近似计算 。 但是 , 它们并不能提供完全精确的结果 , 尤其不适合用于货币计算 。 float 或者 double 精确地表示0.1 是不可行的 。
若需系统来记录十进制小数点 , 可使用BigDecimal 。
2 基本类型优先于装箱基本类型
基本类型(primitive)例如 int、double、long 和 boolean 。 每个基本类型都有一个对应的引用类型 , 称作装箱基本类型(boxed primitive) , 对应为Integer、Double、Long 和 Boolean 。 如书中提到 , 它们的区别如下:

/** 推荐 */public int sum(int a int b) { return a + b;/** 不推荐:不必要的装箱 */public Integer sum(Integer a Integer b) { return a + b; 若无特殊的使用场景 , 推荐总是使用基本类型 。 若不得不使用装箱基本类型 , 注意 == 操作和 NullPointerException 异常 。 装箱基本类型的使用场景:
作为集合中的元素(e.g. SetLong) 参数化类型(e.g. ThreadLocalLong) 反射的方法调用 六 异常 1 每个方法抛出的异常都要有文档
始终要单独地声明受检的异常 , 并且利用Javadoc的@throws标记 , 准确地记录下抛出每个异常的条件 。
在日常工作中 , 笔者调用其他组的 API 时 , 有时会发现一些意料之外的异常 。 良好的文档记录 , 可以帮助 API 调用者更好得处理相关的异常 。 文档记录可包括:异常的类型 , 异常的 error code , 和描述 。
2 其他
一些公司将 API 产生的异常分成 ClientException 和 ServerException 。 一般 ClientException (e.g. 无效的服务 request ) 是由调用方非常规调用 API 导致的异常处理 , 可不在服务端主要的异常监测范围中 。 而 ServerException(e.g. 数据库查询超时)是由服务端自身原因导致的问题 , 平时需要着重监测 。
七 引用 Bloch Joshua. 2018. Effective Java 3rd Edition
作者 | 宜秋
本文为阿里云原创内容 , 未经允许不得转载 。