15. 使类和成员的可访问性最小化

This commit is contained in:
sjsdfg 2018-10-14 13:54:06 +08:00
parent 184b5aceba
commit cf4c438508

View File

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