面向对象思想之使类和成员的可访问性最小化

简介: 讨论面向对象思想中的类和成员的可访问性,以及最小化的必要性

由于现在JAVA生态的壮大,我们可以使用的库和框架很多,他们都帮我们做了很好的封装,使得我们只要引入调用就可以完成业务代码的编写。自己写的业务代码也更倾向于数据的处理,数据关系的设计,而不是代码本身的设计。那面向对象思想中对类和成员的可访问性控制对我们来讲意义还有多大呢?如果你要封装一个sdk的jar包给别人使用,对类和成员的可访问性控制相当重要。

众所周知,暴露给外界使用组件或者API的规则是做到信息隐藏和使得被访问的类和方法的可访问级别最小化。JAVA中对于成员的访问级别有四种:

私有的(private):只有在声明该成员的顶层类内部才可以访问这个成员。

包级私有的(package):声明该成员的包内部的任何类都可以访问这个成员。

受保护的(protected):声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。

公有的(public):在任何地方都可以访问该成员。

对于我们设计sdk,希望对暴露被访问的方法或者类都是public,而内部的大多数是private的,内部之间的按照包的层级和父子类之间的关系进行约束。这样可以提高代码的可维护性和可扩展性。如果所有的属性和方法都是公开的,那么对这些属性和方法的任何修改都可能会导致代码的不稳定性和不可预测性。通过最小化可访问性,我们可以更好地控制代码的状态和行为,并且更容易进行重构和修改。可以让我们设计的类中的数据部分得到很好的保护,不会被随意更改,提高了安全性。

但是,很多人都在想JAVA的反射机制可以操作类中任何属性和方法,定义可访问级别还有意义吗?答案是肯定的。即使使用反射可以访问类的任何属性和方法,但是这种方式通常会导致代码的复杂性和可读性下降。如果类和成员的可访问性被设计为最小化,那么程序员可以更清晰地理解代码的意图和结构,从而更容易编写和维护高质量的代码。如果为了预防抱着恶意的态度去破坏代码的安全性,那需要引入其他的安全措施比如防止反编译,加密的方法去保护代码。跟我们设计良好的类和方法是相辅相成的关系。使用反射的目的不是为了破坏我们所做的设计,而是做一些代码复用和可扩展性。


目录
相关文章
|
9月前
|
算法 C++ 容器
关系类算法函数
关系类算法函数
|
9月前
|
存储 算法 编译器
【C++技能树】令常规运算符用在类上 --类的六个成员函数II
C++中为了增强代码的可读性,加入了运算符的重载,与其他函数重载一样
37 0
【C++之多层继承】成员在各类的范围内的访问属性
【C++之多层继承】成员在各类的范围内的访问属性
|
编译器 C++
C++中如何避免覆盖由继承而来的成员
C++中如何避免覆盖由继承而来的成员
131 0
|
Java 数据库
再生与终结-初识属性覆盖与final | 带你学《Java面向对象编程》之四十一
本节将为读者介绍属性覆盖和final关键字相关内容,并为读者展示如何在Java中定义一个“常量”。
【自然框架】 页面里的父类—— (补充)
没想到下午发的《【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。 》启发了热烈讨论,还以为又是一大堆的口水回复呢。看到大家的热烈讨论我很高兴,这才是我希望的讨论环境,无论是支持的还是反对的,我都非常感谢。
951 0
|
SQL 缓存 JavaScript
【自然框架】 页面里的父类—— 改进和想法、解释
1、 从Control到GridView继承了多少层? (这个图可不是现做的,这是以前为了写QuickPager分页控件而弄的。http://www.cnblogs.com/jyk/archive/2009/04/29/1446033.html )        看上面的类图,远远超过三层了吧。
1189 0
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
629 0