Java 中防御性副本的低效[关闭]

2024-03-14

我是一名长期 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(使用前将#替换为@)

Java 中防御性副本的低效[关闭] 的相关文章

随机推荐

  • Netbeans 不允许 Python 2.6 作为默认平台(强制 Jython2.5)

    我试图让 Netbeans python 使用设置为 Python 2 6 1 我的系统 python 的默认 python 平台运行 因此在 Netbeans 中我执行以下操作 工具 gt Python 平台将 Python 2 6 1
  • 为什么数组协方差被认为如此可怕?

    在 NET 中 引用类型数组是协变的 这被认为是一个错误 但是 我不明白为什么这这么糟糕 请考虑以下代码 string strings new Hey there object objects strings objects 0 new o
  • 我应该在哪里存储配置文件?

    我需要通过Win8在WinXP中读取和写入配置文件到Windows磁盘 他们最好在哪里做这件事 ProgramData 文件夹似乎不允许 procedure TfrmMain FormCreate Sender TObject var pa
  • 输入验证以确保只有数字 c++

    好的 我正在尝试擅长使用指针 因此我正在尝试为用户输入编写输入验证 以确保正确处理任何非数字的内容 当我使用 isdigit 时 它对我不起作用 当我输入字母表时 我仍然遇到异常 有什么建议么 谢谢 看一下这个 include
  • 如何隐藏 Windows Gtk 应用程序的命令提示符?

    我正在使用 MinGW 工具链在 Windows 中编译 Gtk 应用程序 但是当我运行我的应用程序时 会出现一个命令提示符窗口 怎样才能让这个提示消失呢 Check 本文 http ricardo ecn wfu edu cottrell
  • ajax 调用循环 - 访问循环计数器?

    我被困在这里 任何帮助将不胜感激 我有一个项目列表框 我想通过 AJAX 调用 Web 服务 检索列表中每个项目的数据 需要根据调用数据的行来操作检索到的数据 如果我传入 row 参数 它的值始终比行数大 1 有没有办法传入 ajax 调用
  • 使用 lapply 和 which 按特征和功能对数据帧进行子集化

    我有一个包含 5 个维度数据的数据框 如下所示 gt dim alldata 1 162 6 gt head alldata value layer Kmultiplier Resolution Season Variable 1 0 01
  • JPA GROUP BY 实体 - 这可能吗?

    是否可以在 JPA 中选择数据并按引用实体分组 我的意思是 我有两个实体 保险和参考多对一车辆 保险实体具有 validTill 字段 当然还有车辆字段 我想选择车辆及其最新的保险 下面的查询不起作用 SELECT DISTINCT v v
  • 如何在Pygame环境中绘制矩形和圆形

    我正在尝试创建一个具有各种形状的精灵的 pygame 环境 但我的代码似乎不起作用 这是我所拥有的 class Object pygame sprite Sprite def init self position color size ty
  • 在 codeigniter 中一起更新和连接查询?

    连接两个表时更新数据 但在 where 条件下出现错误 我可以在查询中同时使用连接和更新吗 这是我的代码 public function update model id array data textArea data textdata t
  • 在 C 中访问 ELF 符号表

    我正在编写一个程序来模仿elfdump ecps 目前它可以正确打印 elf 标头 程序标头和节标头 但我陷入了符号表的最后几个部分 所需的输出格式为 Symbol Table Section dynsym index value size
  • 如何显示图片并获取鼠标点击坐标[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否可以在Python Windows 中显示一些图片 然后用鼠标单击该图片并获取该单击相对于图片边缘的坐标 Thanks 是
  • Android 4.0 -> 4.3(包含) - Web 视图页面之间的 Web 存储丢失

    我正在开发一个 Android 项目 该项目依赖于WebView浏览设备上存储的多个 HTML 页面 并在需要将输入存储到数据库时将输入提交到 Web 视图 每个页面都包含与 jQuery 绑定到上一页 下一页的控件 每个页面包含不同类型的
  • Linux Mach-O 反汇编器

    是否有任何 Linux 程序可以像 objdump 一样反汇编 OSX 通用 x86 x86 64 fat Mach O 二进制文件 GNU binutils 的 objdump 支持 ELF 和 Windows PE 文件 但不支持 Ma
  • 什么是对象关系映射框架? [复制]

    这个问题在这里已经有答案了 正如标题所说 什么是 ORM 框架以及它有什么用处 一个简单的答案是 您可以使用编程语言将表或存储过程包装在类中 这样您就可以使用对象的方法和属性 而不是编写 SQL 语句来与数据库交互 换句话说 而不是这样的
  • 如何使用负 z-index 使链接可点击?

    我在用drop down我的标题中的菜单用于通知 但是当下拉打开所有可见的 div 后面时 我给了z index到所有 div 但这些 div 上的链接现在不可点击 下拉 div CSS drop down overflow scroll
  • 未捕获错误:语法错误,无法识别的表达式:悬停

    这是问题的 JSFidle http jsfiddle net LRTh3 36 http jsfiddle net LRTh3 36 div boxes mousedown function event Error on this lin
  • Cognito / S3 用户特定策略

    我使用适用于 Android 的 AWS 开发工具包和 Cognito 对我的 AWS 资源的用户进行身份验证 通过 Amazon 登录 我是什么尝试要做的就是设置一个 S3 存储桶 如下所示 my bucket email protect
  • pydantic 和抽象类的子类

    我正在尝试将 pydantic 与如下所示的架构一起使用 class Base BaseModel ABC common int class Child1 Base child1 int class Child2 Base child2 i
  • Java 中防御性副本的低效[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一名长期 C C 程序员 正在学习 Java 我读过有关通过使用返回对私有字段的引用的访问器方法来破坏封装的问题 标准的Java解决方案似乎