2

这是我的课:

public class City
{
    private String _cityName;
    private Point _cityCenter;
    private Point _centralStation;
    private long _numOfResidents;
    private int _noOfNeighborhoods;
    private final long RESIDENTS_CONST_VALUE = 0;
    private final int NEIGHBORHOODS_CONST_VALUE = 1;
}

我的构造函数之一是从其他对象(同一对象)复制:

public City(City other)
{
    _cityName = other._cityName;
    _cityCenter = other._cityCenter;
    _centralStation = other._centralStation;
    _numOfResidents = other._numOfResidents;
    _noOfNeighborhoods = other._noOfNeighborhoods;      
}

public Point(Point point)
{
    _x = point._x;
    _y = point._y;
}

此构造函数获取另一个City对象并复制它的值。我的问题是我所做的是否可以避免混叠或者我需要做其他事情

4

3 回答 3

3

问题是您将引用从旧对象复制到新对象。复制可变字段时会产生问题。如果两个对象共享对一个字段的公共引用,则更改一个对象中的值也会影响复制的对象。

于 2013-11-13T10:06:47.847 回答
2

我看到的唯一问题是对Point类的引用(我假设我们正在学习 about java.awt.Point)。该类是可变的,因此City您从中复制的类可以更改它,并且更改也将反映在您的副本中。使用以下代码复制 Point 对象:

_cityCenter = new Point(other._cityCenter);
_centralStation= new Point(other._centralStation);

其余的字段要么是原始的要么是不可变的,所以没关系

于 2013-11-13T10:11:10.340 回答
0

你所做的看起来很理智,至少因为你没有复制Point对象,这些对象很可能是可变的,即如果你通过简单的赋值复制它们,你将只复制引用,对一个对象的更改将反映在“副本”中-> 浅拷贝。如果您也需要制作它们的副本,那么您也必须为它们实现“复制构造函数”。

然而,在 java 中执行此操作的标准方法是实现Colneable接口并覆盖clone方法。

于 2013-11-13T10:18:02.253 回答