我按照描述实现了复制构造函数here https://stackoverflow.com/questions/15020850/copy-constructors-and-defensive-copying。但问题仍然是当我更新时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
。您也应该修改它以创建列表的副本。可能,您还需要在数组列表中创建元素的副本,如下所示:
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;
}
检查这个帖子 -浅复制与深复制。 https://stackoverflow.com/q/184710/1679863
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)