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;
}

私のコンストラクタの 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

問題は、古いオブジェクトから新しいオブジェクトへの参照をコピーしていることです。可変フィールドのコピー中に問題が発生します。両方のオブジェクトがフィールドへの共通の参照を共有している場合、1 つのオブジェクトの値を変更すると、コピーされたオブジェクトにも影響します。

于 2013-11-13T10:06:47.847 に答える
2

私が目にする唯一の問題は、クラスへの参照に関するものPointです (約 を取っていると仮定していますjava.awt.Point)。このクラスは可変であるため、コピー元のCityクラスで変更でき、その変更はコピーにも反映されます。次のコードを使用して、Point オブジェクトをコピーします。

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

残りのフィールドはプリミティブまたは不変のいずれかなので、問題ありません

于 2013-11-13T10:11:10.340 に答える
0

少なくともPointオブジェクトをコピーしていないため、行ったことは正常に見えます。これらは変更可能である可能性が最も高いです。つまり、単純な代入でコピーすると、参照のみがコピーされ、1 つのオブジェクトへの変更が「コピー」に反映されます。 →浅いコピー。それらのコピーも作成する必要がある場合は、それらの「コピー コンストラクター」も実装する必要があります。

ただし、Java でこれを行う標準的な方法は、Colneableインターフェイスを実装してcloneメソッドをオーバーライドすることです。

于 2013-11-13T10:18:02.253 に答える