我按照描述实现了复制构造函数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/