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

而不是Bundle仅仅为了使用它们在构造函数中实例化一个EdgeComparator而将方向或可能的方向传递给构造函数,只需制作EdgeComparator构造函数参数,并将对它的克隆实例的引用存储在字段 on 中WeightedEdge

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

然后你可以有WeightedEdge实现Cloneable,你将能够在构造克隆时提供所有必要的参数。这还允许您将有关EdgeComparator实现的决定与您的WeightedEdge实现分开,这是一种良好的 OO 实践。

此外,您需要确保 的所有实例Vertex都是不可变的,否则可以通过将可变对象传递给该类来构造该类的可变实例targettarget或者,您也可以在构造函数中克隆。

如果EdgeComparator不可克隆,那么除了提供接受并存储对方向的引用的构造函数之外别无选择,如 Binyamin Sharet 的回答中所示。

于 2013-03-27T22:32:33.483 回答
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
}

hth

于 2013-03-27T22:34:21.727 回答