为什么java语言要设计访问限定符

来源:互联网 发布:清除网络一切痕迹 编辑:程序博客网 时间:2024/05/28 23:11

之前被别人问到了"为什么java语言要设计访问限定符"这个问题,发现是个好问题(之前确实没有仔细想过)。

所以找了下相关资料,将这个问题的答案总结一下。


设计访问限定符的目的

不同于国内的普遍"习惯"---(一大段生涩的理论),《Thinking in Java 4th edition》用实际例子阐述了设计者的目的。

以下内容翻译自"Access Control"(自己翻译的,印象更加深刻一些):

所有优秀的作者,包括软件编写人员,都明白这样一个事实:一个作品往往需要修改多次才能成为好的作品。当你回头看之前写的代码时,往往会想到一个更好的实现方法。这也是"重构(refactoring)"的一个主要动机,而重构的目的是让代码具有更好的可读性、理解性及维护性。经常会有消费者(client programmers)依赖于你的代码,期望它们保持不变。当你想改进代码的时候,他们却希望保持不变。因此,在OOD(object-oriented design)中首先要考虑的就是:把会改变的部分与保持不变的部分分离开来。这一点对于libraries相当重要。library的使用者依赖于他们使用的接口,并且知道:当library升级时,他们并不需要重写代码。而另一方面,library的作者则希望拥有调整与改进的自由,且更改之后并不会影响使用者所依赖的接口。可以通过约定来实现上述目的。例如,library的创建者必须保证在修改class的时候不删除已经存在的方法,因为那样将会破坏library使用者的代码。然而,反过来的情况会更令人苦恼。就拿变量来讲,library的创建者如何知道哪些变量会被使用者访问?这同样适用于方法,即仅仅作为类的实现的一部分,并不打算被使用者直接调用的那些方法。假如library的创建者将一处老的实现更改为新的实现将会怎么样?更改任何地方有可能会破坏使用者的代码。所以library的创建者处境艰难,什么也不能改变。为了解决上面的问题,Java提供了访问限定符,它可以允许library的创建者声明使用者可以使用哪些,不可以使用哪些。可访问范围由大到小依次为:public, protected, 无限定符(package access), private。从上面的内容你可能会想到,作为library的创建者,你想尽量让所有成员保持private,只暴露你想让使用者使用的那些方法。正是如此,即使它对于很多人来说是违反直觉的,尤其是其它语言(尤其是C)的使用者,且习惯没有限制地访问所有的变量及方法。

总结:

其实目的就是OOD首先要考虑的:把会改变的部分与保持不变的部分分离开来,以此来维持library/class的创建者和使用者之间的平衡。即创建者可以修改程序,而修改后并不会影响使用者的代码正常运行,当然使用者也无需更改代码。

作用域

对于各个限定符的作用域就不在这里边具体阐述了,网上关于这方面的资料非常多。

我在这里只画一个简单的表格,用以表示4种限定符的作用范围。


       访问限定符                  class             package     子类(同package)子类(其它package)   world(全局)    public              ✔          ✔             ✔              ✔          ✔ protected             ✔          ✔             ✔              ✔          ✘ -/默认             ✔          ✔             ✔              ✘          ✘ private             ✔          ✘             ✘              ✘          ✘

参考

  1. Controlling Access to Members of a Class
  2. In Java, what's the difference between public, default, protected, and private?
  3. 《Thinking in Java 4th edition》




0 0
原创粉丝点击