Files
effective-Java/ch04类和接口/16.在公共类中使用访问方法而不是公共属性.md

12 lines
1.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 在公共类中使用访问方法而不是公共属性
- [Item16Example01.java](ClassesAndInterfaces/src/main/java/com/jueee/item16/Item16Example01.java)退化的类degenerate classes除了集中实例属性之外别无用处。
- [Item16Example02.java](ClassesAndInterfaces/src/main/java/com/jueee/item16/Item16Example02.java)具有私有属性和公共访问方法的类getter而对于可变类来说它们应该被替换为 setter 设值方法。
对于公共类来说,坚持面向对象是正确的:**如果一个类在其包之外是可访问的,则提供访问方法来保留更改类内部表示的灵活性。** 如果一个公共类暴露其数据属性,那么以后更改其表示形式基本上没有可能,因为客户端代码可以散布在很多地方。
但是,**如果一个类是包级私有的,或者是一个私有的内部类,那么暴露它的数据属性就没有什么本质上的错误——假设它们提供足够描述该类提供的抽象。** 在类定义和使用它的客户端代码中,这种方法比访问方法产生更少的视觉混乱。 虽然客户端代码绑定到类的内部表示,但是这些代码仅限于包含该类的包。 如果类的内部表示是可取的,可以在不触碰包外的任何代码的情况下进行更改。 在私有内部类的情况下,更改作用范围进一步限制在封闭类中。
虽然公共类直接暴露属性并不是一个好主意,但是如果属性是不可变的,那么危害就不那么大了。当一个属性是只读的时候,除了更改类的 API 外,你不能改变类的内部表示形式,也不能采取一些辅助的行为,但是可以加强不变性。
**示例代码**[Item16Example03.java](ClassesAndInterfaces/src/main/java/com/jueee/item16/Item16Example03.java):保证每个实例表示一个有效的时间。