java - 拷贝构造函数创建依赖拷贝

标签 java clone copy-constructor

我按照描述实现了复制构造函数here .但问题仍然是,当我更新 route_copy 时,同样的更新会应用于 route。所以,我不明白我的代码有什么问题?

public class Route implements Comparable<Route> {
    private List<Site> sites;

    public Route()
    {
        sites = new ArrayList<Site>();
    }

    public Route(List<Site> sites)
    {
        this.sites = sites;
    }

    /**
     * Copy constructor
     */
    public Route(Route r) {
        this(r.sites);
    }

    public void deleteSite(Site s) {
        this.sites.remove(s);
    }
}

public processData(Route route)
{
  Route route_copy = new Route(route);
  Site s = selectSite(route_copy);
  route_copy.deleteSite(s); // !!! now 'route' does not contain an  element 's'
}

最佳答案

在你的拷贝构造函数中,你只是在做一个浅拷贝,而你需要做一个深拷贝:

public Route(Route r) {
    this(r.sites);
}

在这里,您仍然复制list 的引用,它仍然指向同一个ArrayList。您也应该修改它以创建列表的副本。可能,您还需要像这样在 arraylist 中创建元素的副本:

public Route(Route r) {
    List<Site> newSites = new ArrayList<Site>();

    for (Site obj: r.sites) {
        // Add copy of obj to the newSites
        // So you need yet another copy constructor in 'Site' class.
    }

    this.sites = newSites;
}

查看此帖子 - Shallow Copy vs Deep Copy.

关于java - 拷贝构造函数创建依赖拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703067/

相关文章:

java - 在共享文件夹上托管 MySQL

ruby-on-rails - 防止实例上的 ActiveRecord save()

javascript - 生成和拖动 SVG 元素 - 方法

c++ - 制作一个 const unique_ptr 然后尝试从它 std::move 给出相同的错误,就好像您试图访问复制构造函数一样

java - 如何使用 React CloudFoundry 客户端启动 Cloud Foundry 应用程序?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 将巨大的包添加到新项目中(Eclipse)

Git 克隆 : remote end hung up unexpectedly, 尝试更改 postBuffer 但仍然失败

c++ - 禁用复制构造函数

C++ 模板复制构造函数,编译器说 "passing const as this argument discards qualifiers"