编程语言
首页 > 编程语言> > java-副本构造函数创建依赖副本

java-副本构造函数创建依赖副本

作者:互联网

我实现了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);
}

在这里,您仍在复制列表的引用,该引用仍指向相同的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,clone,copy-constructor
来源: https://codeday.me/bug/20191012/1903509.html