Effective Java - 类和接口 - 在公有类中使用访问方法而非公有域

本文探讨了类数据域的封装技巧,强调了使用getter和setter方法的重要性,并提到了包级私有或私有的嵌套类如何直接暴露数据域。

读书笔记 仅供参考

  • 即类数据域应该封装,使用 getter 和 setter 方法来读写
  • 包级私有或私有的嵌套类,可以直接暴露数据域
### 第8章 方法构建的艺术 #### 检查参数有效性 在方法执行前,检查参数的有效性是很重要的。对于公有方法使用 `assert` 是不够的,因为 `assert` 可以在运行时被禁用。可以使用 `if` 语句抛出异常来进行参数检查。例如: ```java public static int divide(int dividend, int divisor) { if (divisor == 0) { throw new IllegalArgumentException("Divisor cannot be zero"); } return dividend / divisor; } ``` #### 必要时进行保护性拷贝 在方法中,如果接收的参数是可变对象,为了防止外部对象修改内部状态,应该进行保护性拷贝。例如: ```java import java.util.Date; public class Period { private final Date start; private final Date end; public Period(Date start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); if (this.start.compareTo(this.end) > 0) { throw new IllegalArgumentException("Start date must not be after end date"); } } public Date start() { return new Date(start.getTime()); } public Date end() { return new Date(end.getTime()); } } ``` #### 慎用重载 重载方法的选择是在编译时进行的,而不是运行时。因此,在使用重载时要谨慎,避免出现混淆。例如,`ObjectOutputStream` 中的 `write` 方法,通过不同的参数型进行重载,但要确保调用时不会出现意外的结果。 #### 慎用可变参数 可变参数允许方法接受任意数量的参数,但过度使用会影响代码的可读性性能。在使用可变参数时,应该确保至少有一个必需的参数。例如: ```java public static int sum(int... numbers) { int result = 0; for (int number : numbers) { result += number; } return result; } ``` #### 返回零长度的数组或集合,而不是 null 在方法返回数组或集合时,返回零长度的数组或集合比返回 `null` 更方便调用者处理。例如: ```java import java.util.ArrayList; import java.util.List; public class CollectionExample { public static List<String> getEmptyList() { return new ArrayList<>(); } } ``` ### 第9章 编程基础规范 #### 优先使用标准的异常 在抛出异常时,优先使用 Java 标准库中提供的异常,如 `IllegalArgumentException`、`IllegalStateException` 等,这样可以提高代码的可读性可维护性。 #### 抛出与抽象相对应的异常 方法抛出的异常应该与它所实现的抽象层次相对应。如果底层异常与高层抽象不相关,可以使用异常转译,将底层异常转换为高层抽象的异常。 #### 每个方法抛出的异常都要有文档记录 在编写方法时,应该使用 Javadoc 的 `@throws` 标签记录方法可能抛出的异常,方便调用者了解方法使用风险。 #### 避免不必要的受检异常 受检异常会强制调用者处理异常,增加了代码的复杂度。如果异常发生的可能性很小,或者调用者无法采取有效的措施来处理异常,应该使用非受检异常。 #### 努力使失败保持原子性 方法在失败时,应该保持对象的状态不变,即具有失败原子性。可以通过在操作前检查参数、使用临时对象等方式来实现。 #### 不要忽略异常 在捕获异常后,不能简单地忽略异常,至少要记录日志,以便后续排查问题。例如: ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 记录日志 java.util.logging.Logger.getLogger("MyLogger").log(java.util.logging.Level.SEVERE, "Exception occurred", e); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值