4

私はintとして重みを持つ不変オブジェクトを持っています.私のコードでは、重みを更新する必要があります.inroderを実行するには、そのオブジェクトのコピーを作成し、更新された値で重みを設定する必要があります. しかし、オブジェクトには clone() オーバーライドがありません。また、clone() または Cloneable インターフェイスの実装のどちらが優れているかわかりません。

ここに私のクラスがあります:

public class WeightedEdge implements Edge {

    private final WeightedEdgeComparator _weightedEdgeComparator;

    private final Vertex _target;

    private final int _weight;

    WeightedEdge(Bundle bundle, Vertex target, int weight) {
        _weightedEdgeComparator = new EdgeComparator(bundle.getDirection());
        _target = target;
        _weight = weight;
    }

    @Override
    public Vertex target() {
        return _target;
    }

    @Override
    public int weight() {
        return _weight;
    }

        @Override
    public int compareTo(WeightedEdge o) {
        return _EdgeComparator.compare(this, o);
    }

    @Override
    public int hashCode() {...}

    @Override
    public boolean equals(Object obj) { ... }

    @Override
    public String toString() { ... }
4

3 に答える 3

4

新しい値で新しいオブジェクトを返すだけではどうですか:

// as mentioned by AndrewBissell, there is no reference to the bundle
// luckily, we only need the direction from the bundle :)
private final int _direction;

WeightedEdge(Bundle bundle, Vertex target, int weight) {
    this(bundle.getDirection(), target, weight);
}

WeightedEdge(int direction, Vertex target, int weight)
{
    _direction = direction;
    _weightedEdgeComparator = new EdgeComparator(_direction);
    _target = target;
    _weight = weight;

}

WeightedEdge updatedObject(int newWeight)
{
    return new WeightedEdge(_direction, _target, newWeight);
}
于 2013-03-27T22:19:54.427 に答える
0

別のコンストラクターを使用してオブジェクトのクローンを作成し、重量部分のみを更新できます。

WeightedEdge(WeightedEdge wEdge, int weight) {
     //copy all fields of wEdge into THIS object, except weight.  
     //use int weight parameter to set the new weight
}

h番目

于 2013-03-27T22:34:21.727 に答える
0

Bundleコンストラクターで をインスタンス化するためだけに方向をコンストラクターに渡すのではなくEdgeComparator、単純にEdgeComparatorコンストラクター引数を作成し、それの複製されたインスタンスへの参照を のフィールドに格納しますWeightedEdge

WeightedEdge(EdgeComparator comparator, Vertex target, int weight) {
    _weightedEdgeComparator = comparator.clone();
    _target = target;
    _weight = weight;
}

その後、WeightedEdge実装Cloneableすることができ、クローンを構築するときに必要なすべての引数を提供できます。EdgeComparatorこれにより、実装に関する決定を実装から分離することもできますWeightedEdge。これは、OO の優れたプラクティスです。

また、 のすべてのインスタンスが不変であることを確認する必要があります。そうしないとVertex、可変クラスを渡すことで、このクラスの可変インスタンスを構築できるようになりますtargettargetまたは、コンストラクターで複製することもできます。

が複製可能でない場合、EdgeComparatorBinyamin Sharet の回答に示されているように、方向への参照を受け入れて保存するコンストラクターを提供する以外に方法はありません。

于 2013-03-27T22:32:33.483 に答える