我是一名长期 C/C++ 程序员,正在学习 Java。我读过有关通过使用返回对私有字段的引用的访问器方法来破坏封装的问题。标准的Java解决方案似乎是防御性复制——调用复制构造函数或clone()来创建字段的副本并返回对该副本的引用。我不明白为什么没有人担心制作防御性副本的低效率。在 C++ 中,访问器只会返回一个指向 const 的指针,从而保护私有成员而不进行复制。为什么Java没有const引用?
为什么Java没有const引用?
问题只能由语言设计者正确回答,但我认为问题在于他们无法弄清楚如何使其作为语言设计的一部分发挥作用。我的回忆(来自我曾经遇到过的一些“Java 设计原理”文档)是 Gosling 等人最初想要支持const
...
事实上,虽然C和C++都支持const
作为表达可变性约束的一种方式,它们都存在允许某些代码“破坏”约束的漏洞。 (参见维基百科文章常量正确性 http://en.wikipedia.org/wiki/Const-correctness.)可能是因为难以提出一种没有(或不需要)此类漏洞的 Java 设计,导致 Gosling 等人放弃了这个想法。
另一方面是,Java 中防御性复制的需求并不像您想象的那么大,而且这样做的成本也不像您想象的那么大。当防御性副本的成本很高时,Java 中还有其他选择……例如创建“不可修改”的包装对象,或仅支持“读取”操作的接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)