在Java中通过复制构造函数复制对象而不影响原始对象

2023-11-21

我正在尝试复制一个对象,然后对其进行修改,而不更改原始对象。

I found 这个解决方案似乎最好的方法是复制构造函数 - 根据我的理解,这会给我一个深层复制(与原始对象完全独立的对象)。

所以我尝试了。但是,我注意到,当执行以下代码时,它会影响从中复制它的所有先前对象。当我打电话时surveyCopy.take(),这将改变内部的值Survey,它还会更改 selectedSurvey 内部的值。

public class MainDriver {
...
//Code that is supposed to create the copy
case "11":  selectedSurvey = retrieveBlankSurvey(currentSurveys);
            Survey surveyCopy = new Survey(selectedSurvey);
            surveyCopy.take(consoleIO);
            currentSurveys.add(surveyCopy);
            break;
}

这是我的复制构造函数的代码:

public class Survey implements Serializable
{
    ArrayList<Question> questionList;
    int numQuestions;
    String taker;
    String surveyName;
    boolean isTaken;

    //Copy constructor
    public Survey(Survey incoming)
    {
        this.taker = incoming.getTaker();
        this.numQuestions = incoming.getNumQuestions();
        this.questionList = incoming.getQuestionList();
        this.surveyName = incoming.getSurveyName();
        this.isTaken = incoming.isTaken();
    }
}

那么到底是什么问题呢?复制构造函数不能那样工作吗?难道是我编码方式不对?


这就是您的复制构造函数中的问题:

this.questionList = incoming.getQuestionList();

这只是复制参考到列表中。两个对象仍然引用同一个对象。

您可以使用:

this.questionList = new ArrayList<Question>(incoming.getQuestionList());

创建原始列表的副本 - 但这是still还不够好如果Question本身是可变的。在这种情况下,您必须为每个创建一个副本Question目标实现完全隔离。

您的其他字段没问题,因为它们要么是原语,要么是对String(这是不可变的,允许您安全地共享引用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Java中通过复制构造函数复制对象而不影响原始对象 的相关文章

  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • Visual Studio:使用属性使视图代码默认

    我知道怎么做配置 VS 2008 在代码中而不是设计器中打开 Windows 窗体控件 但我想我已经找到了一种方法 可以使用一个可以装饰所需控件的属性来实现此目的 有人知道它的名字吗 如果您希望在设计器中打开一些控件并在 C 代码视图中打开
  • 无法使用 JavaScript 在 IE 上打印 iframe,而是打印父页面

    我有以下 JavaScript 代码 document ready function a print button click function event event preventDefault var print url print
  • XMLHttpRequest 无法从模拟器上的 android asset 文件夹加载文件

    我是混合开发的新手 我编写了一个启动 webview 的小应用程序 我在 asset 文件夹中复制了 XML JS 文件 应用程序在我的三星平板电脑上运行良好 但在模拟器上出现以下错误 05 30 06 09 07 080 I 铬 1245
  • @font-face导轨3.2

    我正在考虑尝试使用 font face 在我的 Rails 应用程序中使用 font squirrels 字体 希望这是解释它的正确方式 我对此还比较陌生 所以希望有人能就如何让它在 Rails 应用程序中工作提供建议 Thanks 好吧
  • Mysql 在使用 LIKE 搜索时连接两列

    我正在尝试进行 MySQL 查询 其中使用 LIKE 关键字根据搜索文本过滤记录 例如 如果用户搜索Illusion Softwares where Illusion是名字并且Softwares是姓氏 因此查询应搜索列 FirstName
  • 获取多行 UILabel 最后一行的宽度

    我有一个动态多行 UILabel 需要知道可见文本 不是标签 的文本结尾 X 坐标 以便我可以在文本后面显示一些内容 这可能吗 谢谢 您将能够使用 CoreText 框架更好地控制文本布局 查看文档 还有一些不错的开源东西已经为您做了很多艰
  • Android 布局土地不工作

    我一直在 stackoverflow 中查看问题 并尝试了我所见过的所有方法 但布局区域不起作用 在我的代码中我有和方法onConfigurationChanged Override public void onConfigurationC
  • 未知未知的本机崩溃

    我有一个完全用 Java 编写的应用程序 没有任何本机代码 并且我在开发人员控制台上两次收到崩溃报告 未知未知的本机崩溃 我不知道从哪里开始查找问题的根源 搜索仅在 Android 错误 NDK 使用或有错误的第三方库的情况下发现这种类型的
  • 在 Python 中一次更改列表中的多个项目

    我可以在Python中一次更改列表中的多个项目吗 问题1 例如 我的清单是 lst 0 0 0 0 0 我想要第三项和第五项变成99 我知道我可以做到 lst 2 99 lst 4 99 然而 有没有更简单的方法来做到这一点呢 问题2 在这
  • 如何在不安装 numpy 的情况下使用它?

    我通过控制台访问没有 root 或 sudo 权限的计算机 Python版本是2 5 2 numpy不可用 我无法使用 python setup py install user 机器上也没有任何可用的编译器 我可以以某种方式使用可用的编译包
  • 如何过滤 std::integer_sequence

    如果理论上我有一个整数序列 例如 std integer sequence
  • 冲突的红宝石

    我需要在我的项目中使用两个 gem 它们都声明 PDF 命名空间 pdf reader 和 htmldoc 有什么办法可以让他们一起愉快地玩耍吗 我能想到的唯一方法是重写我自己的 htmldoc 版本 为其提供不同的命名空间 基本上 你无能
  • 使用 javascript 按 id 对列表进行排序 [重复]

    这个问题在这里已经有答案了 我正在 iOS 上制作一个phonegap应用程序 需要按时间对列表进行排序 我尝试将时间添加到每个 li 项目的 id 中 然后根据 id 进行排序 ul li blub li li blaaah li li
  • Cronjob 还是 MySQL 事件?

    我必须每小时更新一次 MySQL 数据库 我想知道使用 cronjob 与 MySQL 事件相比有何优点 缺点 例如 哪个更快 哪个更安全 谢谢 我总是会进行 cron 工作 因为 这就是系统管理员所期望的 这一点不可低估 crontab
  • 如何从java中的静态初始化块返回

    我想从静态块返回 看起来 return 和 break 语句不起作用 有没有什么替代方案 我知道不好的解决方法可能是创建一个标志并检查该标志是否继续 我知道初始化块并不用于进行计算 而只是用于类加载期间的基本初始化 将代码委托给私有静态方法
  • 如何降级我的 Rails 版本?

    我使用的是 Rails 版本 4 2 0 如何降级到3 2 19版本 我尝试了以下方法 我打开命令提示符 I typed gem uninstall rails Rails 版本有一些选项 然后我选择了当前版本并按 Enter 然后输入ge
  • 使用 Google 电子表格访问 BigQuery

    我在互联网上查找如何在谷歌电子表格中导入bigquery数据 我找到了这个appscript示例 但它不起作用API不在同一级别 并且我没有找到如何在appscript中使用API 2或API beta1进行查询 function runQ
  • 如何更改使用 --bare 克隆的 git 存储库以匹配使用 --mirror 克隆的 git 存储库?

    这个问题与git 如何从其他存储库镜像文件 or 如何更新我的裸存储库 由于存储库克隆为 mirror是一个裸存储库 我可以使用以下命令克隆一个存储库吗 bare就像一个克隆人 mirror 是不是只要修改config文件就可以了 如果没有
  • Scala:将函数定义为正确的类型

    我一直在研究 Scala 代码 并遇到了一个我不明白的编译器错误 该代码生成一个由整数对组成的向量 然后尝试对其进行过滤 val L for x lt 1 to 5 yield x x x val f x Int y Int gt x gt
  • 在Java中通过复制构造函数复制对象而不影响原始对象

    我正在尝试复制一个对象 然后对其进行修改 而不更改原始对象 I found 这个解决方案似乎最好的方法是复制构造函数 根据我的理解 这会给我一个深层复制 与原始对象完全独立的对象 所以我尝试了 但是 我注意到 当执行以下代码时 它会影响从中