目标:
5.1 编写代码,实现类中的紧峯装、松耦合和高内聚,并描述这样做的优点。
假设你为某个类编写了代码,而公司中许多其他程序员编写的代码都是用这个类。后来如果你不喜欢该类的运作方式,因为他的一些实例变量被(其他程序员在他们的代码中) 设置成一些没有预料到的值。他们的代码使你的代码出现错误(不要紧张,这仅仅是个假设)。型号它是个Java程序,因此你应当能够发布这个类的一个新版本,而其他程序员能够在他们的程序中替换该类,而不必修改任何代码。
在实现代码中进行修改,而不中断使用改代码的其他人的代码的能力,是封装的主要优点。我们希望将实现细节隐藏在公共程序设计接口的后面。这里所说的接口是指为其他代码调用提东一套可访问的方法——换句话说,就是代码的API。通过隐藏实现细节,你能够改写你的方法代码(也学还可以修改类使用变量的方式),而不必要求对调用修改后的方法的代码进行修改。
如果需要可维护性、灵活性和可扩展性(当然,我们确实需要这些) ,则设计时必须包含封装。该如何实现呢?
- 保护实例变量(使用访问修饰符,通常是private) 。
- 建立public访问器方法,强制调用代码使用这些方法二不是之间访问实例变量。
- 对于方法,使用JavaBeans命名规则set<Property >和get<Property>。
如图演示了封装强制代码的调用程序通过方法二不是直接访问变量这一思想。
图待定
我们将访问方法称作getter(读取器) 和setter(设置器),但有些人喜欢拟人化术语accessor(访问器)和mutator(变化器)(就个人而言,我们不喜欢“变化”这样的字眼)。无论怎么样称呼,他们都是其他程序员访问视力变量是必须使用的方法。它们看似简单,你很可能会一直像下面这样使用它们:
考试注意事项:
要注意那些似乎是在访问方法的行为的代码,而问题实际上是没有封装。请看下面的例子,看能否找出问题:
现在考虑如下问题:right的值会总是left值的三分之一吗?答案似乎是肯定的,但于要注意,Foo类的用户不需要使用setLeft()方法!它们能够轻易地直接访问视力变量,并将它们修改成任意的int值。