由于现在JAVA生态的壮大,我们可以使用的库和框架很多,他们都帮我们做了很好的封装,使得我们只要引入调用就可以完成业务代码的编写。自己写的业务代码也更倾向于数据的处理,数据关系的设计,而不是代码本身的设计。那面向对象思想中对类和成员的可访问性控制对我们来讲意义还有多大呢?如果你要封装一个sdk的jar包给别人使用,对类和成员的可访问性控制相当重要。
众所周知,暴露给外界使用组件或者API的规则是做到信息隐藏和使得被访问的类和方法的可访问级别最小化。JAVA中对于成员的访问级别有四种:
私有的(private):只有在声明该成员的顶层类内部才可以访问这个成员。
包级私有的(package):声明该成员的包内部的任何类都可以访问这个成员。
受保护的(protected):声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。
公有的(public):在任何地方都可以访问该成员。
对于我们设计sdk,希望对暴露被访问的方法或者类都是public,而内部的大多数是private的,内部之间的按照包的层级和父子类之间的关系进行约束。这样可以提高代码的可维护性和可扩展性。如果所有的属性和方法都是公开的,那么对这些属性和方法的任何修改都可能会导致代码的不稳定性和不可预测性。通过最小化可访问性,我们可以更好地控制代码的状态和行为,并且更容易进行重构和修改。可以让我们设计的类中的数据部分得到很好的保护,不会被随意更改,提高了安全性。
但是,很多人都在想JAVA的反射机制可以操作类中任何属性和方法,定义可访问级别还有意义吗?答案是肯定的。即使使用反射可以访问类的任何属性和方法,但是这种方式通常会导致代码的复杂性和可读性下降。如果类和成员的可访问性被设计为最小化,那么程序员可以更清晰地理解代码的意图和结构,从而更容易编写和维护高质量的代码。如果为了预防抱着恶意的态度去破坏代码的安全性,那需要引入其他的安全措施比如防止反编译,加密的方法去保护代码。跟我们设计良好的类和方法是相辅相成的关系。使用反射的目的不是为了破坏我们所做的设计,而是做一些代码复用和可扩展性。