在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中通过复制构造函数复制对象而不影响原始对象 的相关文章

随机推荐

  • 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 这个解决方案似乎最好的方法是复制构造函数 根据我的理解 这会给我一个深层复制 与原始对象完全独立的对象 所以我尝试了 但是 我注意到 当执行以下代码时 它会影响从中