读《Effective Java》笔记 - 条目15
条目15:最小化类和成员地可访问性
Java中四种访问修饰符
public
:可以被任何类访问。protected
:可以被同一包中的类和子类访问。default
(无修饰符):只允许同一包中的类访问。private
:只能被当前类访问。
为什么要最小化可访问性?
- 减少不必要的依赖:公开的字段或方法会让外部代码依赖于它们的具体实现。如果我们改变了公开的 API,可能会破坏与外部代码的兼容性。通过将字段或方法的访问限制为
private
或protected
,可以减少这种风险。 - 增强封装性:类内部的实现细节应对外部不可见,避免直接访问类的内部状态,保证类的封装性。封装性好,类就更容易维护和修改。
- 提高可测试性:当类的内部细节受限时,我们可以更容易地编写单元测试,专注于类的行为,而不需要关注其实现细节。
遵循原则
- 尽量使用
private
修饰符:大多数成员(如字段和方法)应当设为private
,除非它们需要被外部访问。对于字段,private
是最安全的选择。 - 使用包内访问(default):当类的成员只需要在同一个包内使用时,可以将它们设置为包内访问(即不加修饰符)。这种方式比
public
更严格,也足够灵活,避免了外部不必要的访问。 protected
应谨慎使用:protected
会让子类和同包类可以访问成员,但它也会暴露给继承类,所以除非有充分理由,不要随意使用protected
。尤其在 Java 的组合优于继承的哲学下,尽量避免继承和公开protected
成员。public
只用于 API 的必要部分:如果方法或类需要对外提供功能,那么它才应该是public
。但即使是public
,也应当确保其设计对外接口的简洁与清晰,避免暴露不必要的实现细节。- 除了作为常量地共有静态
final
字段外,公有类不应该由任何公有的字段。 - 确保公有的静态
final
字段所引用的对象是不可变的