Java理论与实践 - 它是谁的对象? - 编程入门网
Point 属性 来表示其位置的 UI组件。清单 3 显示了实现 存取器方法 setLocation 和 getLocation的三种方式。第一种方式是最懒散的 ,并且提供了最好的性能,但是对于蓄意攻击和无意识的失误,它有几个薄弱环 节。
清单 3. getters 和 setters的值语义以及引用语义
现在来考虑 setLocation 看起来是无意的使用 :
或者是:
在setLocation/getLocation存取器实现的版本 1 之下,可能看起来好像第 一个Widget的 位置是 (1, 1) ,第二个Widget的位置是 (2, 2),而事实上,二 者都是 (2, 2)。这可能对于调用者(因为第一个Widget意外地移动了)和 Widget 类(因为它的位置改变了,而与Widget代码无关)来说都会产生混淆。 在第二个例子中,您可能认为自己只是将Widget w2移动到 Widget w1当前所在 的位置 ,但是实际上您这样做便规定了每次w1 移动时w2都跟随w1 。 Java理论与实践 - 它是谁的对象?(3)时间:2010-12-20防御性副本 setLocation 的版本 2 做得更好:它创建了传递给它的参数的一个副本,以 确保不存在可以意外改变其状态的 Point的别名。但是它也并非无可挑剔,因为 下面的代码也将具有一个很可能不希望出现的效果,即Widget在不知情的情况下 被移动了:
getLocation 和 setLocation 的版本 3 对于别名引用的恶意或无意使用是 完全安全的。这一安全是以一些性能为代价换来的:每次调用一个 getter 或 setter 都会创建一个新对象。 getLocation 和 setLocation 的不同版本具有不同的语义,通常这些语义被 称作值语义(版本 1)和引用语义(版本 3)。不幸的是,通常没有说明实现者 应该使用的是哪种语义。结果,这个类的使用者并不清楚这一点,从而作出了更 差的假设(即选择了不是最合适的语义)。 getLocation 和 setLocation 的版本 3 所使用的技术叫做防御性复制( defensive copying),尽管存在着明显的性能上的代价,您也应该养成这样的 习惯,即几乎每次返回和存储对可变对象或数组 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |