mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-03-19 22:00:52 +08:00
15. 使类和成员的可访问性最小化
This commit is contained in:
parent
184b5aceba
commit
cf4c438508
@ -6,7 +6,7 @@
|
||||
|
||||
Java 提供了许多机制来帮助信息隐藏。 访问控制机制(access control mechanism)[JLS,6.6] 指定了类,接口和成员的可访问性。 实体的可访问性取决于其声明的位置,以及声明中存在哪些访问修饰符(private,protected 和 public)。 正确使用这些修饰符对信息隐藏至关重要。
|
||||
|
||||
经验法则很简单:**让每个类或成员尽可能地不可访问。**换句话说,使用尽可能低的访问级别,与你正在编写的软件的对应功能保持一致。
|
||||
经验法则很简单:**让每个类或成员尽可能地不可访问。** 换句话说,使用尽可能低的访问级别,与你正在编写的软件的对应功能保持一致。
|
||||
|
||||
对于顶层 (非嵌套的) 类和接口,只有两个可能的访问级别:包级私有(package-private)和公共的(public)。如果你使用 public 修饰符声明顶级类或接口,那么它是公开的;否则,它是包级私有的。如果一个顶层类或接口可以被做为包级私有,那么它应该是。通过将其设置为包级私有,可以将其作为实现的一部分,而不是导出的 API,你可以修改它、替换它,或者在后续版本中消除它,而不必担心损害现有的客户端。如果你把它公开,你就有义务永远地支持它,以保持兼容性。
|
||||
|
||||
@ -27,7 +27,7 @@ Java 提供了许多机制来帮助信息隐藏。 访问控制机制(access c
|
||||
|
||||
为了便于测试你的代码,你可能会想要让一个类,接口或者成员更容易被访问。 这没问题。 为了测试将公共类的私有成员指定为包级私有是可以接受的,但是提高到更高的访问级别却是不可接受的。 换句话说,将类,接口或成员作为包级导出的 API 的一部分来促进测试是不可接受的。 幸运的是,这不是必须的,因为测试可以作为被测试包的一部分运行,从而获得对包私有元素的访问。
|
||||
|
||||
**公共类的实例属性很少公开 (条目 16)。**如果一个实例属性是非 final 的,或者是对可变对象的引用,那么通过将其公开,你就放弃了限制可以存储在属性中的值的能力。这意味着你放弃了执行涉及该属性的不变量的能力。另外,当属性被修改时,就放弃了采取任何操作的能力,**因此公共可变属性的类通常不是线程安全的**。即使属性是 final 的,并且引用了一个不可变的对象,通过使它公开,你就放弃切换到不存在属性的新的内部数据表示的灵活性。
|
||||
**公共类的实例属性很少公开 (条目 16)。** 如果一个实例属性是非 final 的,或者是对可变对象的引用,那么通过将其公开,你就放弃了限制可以存储在属性中的值的能力。这意味着你放弃了执行涉及该属性的不变量的能力。另外,当属性被修改时,就放弃了采取任何操作的能力,**因此公共可变属性的类通常不是线程安全的** 。即使属性是 final 的,并且引用了一个不可变的对象,通过使它公开,你就放弃切换到不存在属性的新的内部数据表示的灵活性。
|
||||
|
||||
同样的建议适用于静态属性,但有一个例外。 假设常量是类的抽象的一个组成部分,你可以通过 public static final 属性暴露常量。 按照惯例,这些属性的名字由大写字母组成,字母用下划线分隔(条目 68)。 很重要的一点是,这些属性包含基本类型的值或对不可变对象的引用(条目 17)。 包含对可变对象的引用的属性具有非 final 属性的所有缺点。 虽然引用不能被修改,但引用的对象可以被修改,并会带来灾难性的结果。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user