第15条 是类和成员的可访问性最小化
- 设置访问级别的规则:尽可能的使每个类或者成员不被外界访问
- 对于顶层(非嵌套)的类和接口,只有两种可能的访问级别:包级私有(package private)和公有(public)。
- 如果一个包级私有的顶层类(或接口)只是在某一个类的内部被用到, 就应该考虑使它成为那个类的私有嵌套类.
- 如果覆盖了超类中的一个方法, 子类中的访问级别就不允许低于超类中的访问级别.
- 为了测试将一个公有类的私有成员编程包级私有是可以接受的,但是不能再超过包级私有的访问限制了
- 公有类的实例域绝不能是共有的,包含公有可变域的类通常并不是线程安全的
- 用final符修饰的内容,如果知识可变对象的引用,则比较危险,比如数组、List等。可以暴露Immutable的List,或者使用方法,每次返回一个clone实例。
这一节讲的内容相对比较抽象,简单说一下开发过程中碰到的例子以及自己的一些理解:
- 其实
protected
是我们比较少使用的访问级别。我自己在开发过程中,只有抽出来了abstract
抽象类,暴露给外面的方法是public
,而抽象方法是只是一个辅助功能的时候,才会把抽象方法做成protected
,也算是模板方法模式 - 我们在真正的开发过程中,包的概念其实更像是一种分类,创建
class
的时候,应该属于哪种分类,就会放到哪个package
中,但是一个package
中的不同class
很少有联系。而作者这里更倾向于让每一个package
是一个整体,其中有一部分public
的类对方暴露功能,其它的类负责打辅助。这种设计确实是我们在系统开发中很少会碰到使用的 - 理论上来说,每个类最好都有自己的对外的行为,而不是简单的get、set自己的内容(VO、DTO)。Java14引入了
record
类型,可能就是出于这种目的。仅仅是传输内容的对象,就使用record
就好了,还帮助我们写了get、set、equals等等。我们自己写的有逻辑的内容再用class
- 如果在开发过程中,需要我们放大内容的访问级别,这时候就要停下来思考一下,是不是哪里有不合理的地方,按道理来说应该是可以避免的。比如之前碰到的例子,类A(
public
)依赖类B(protected
),在其它地方创建类A的时候必须先创建类B,但是因为访问不到,只能将B变成public。后来仔细想想,其实是可以把B放到A里变成内部类的,就是这里说的第3点内容
网友评论