gpt4 book ai didi

java - Java中不可变和可变对象的设计

转载 作者:行者123 更新时间:2023-12-04 21:27:35 27 4
gpt4 key购买 nike

我的问题与 API 设计有关。

假设我正在设计一个 vector (数学/物理意义)。我想要一个不可变的实现和一个可变的实现。

我的 vector 看起来像这样:

public interface Vector {
public float getX(); public float getY();
public X add(Vector v);
public X subtract(Vector v);
public X multiply(Vector v);
public float length();
}

我想知道如何确保同时拥有可变和不可变的实现。我不太喜欢 java.util.List 的方法(默认允许可变性)和 Guava 的不可变实现所具有的 UnsupportedOperationException()。

如何使用这两种实现设计一个“完美”的接口(interface)或抽象类 Vector?

我想过这样的事情:

public interface Vector {
...
public Vector add(Vector v);
...
}
public final class ImmutableVector implements Vector {
...
public ImmutableVector add(Vector v) {
return new ImmutableVector(this.x+v.getX(), this.y+v.getY());
}
...
}
public class MutableVector implements Vector {
...
public MutableVector add(Vector v) {
this.x += v.getX();
this.y += v.getY();
return this;
}
...
}

总而言之,我想检查一下这种方法是否存在明显的设计缺陷,它们是什么,我应该怎么做才能修复这些缺陷?


注意:“vector ”是更一般用例的示例。为了我的问题,我可以选择重写 List 接口(interface)或其他任何东西。请关注更一般的用例。


最后的选择,在下面的答案之后,基于有人解释但现在编辑的 Joda-time:

/** Basic class, allowing read-only access. */
public abstract class ReadableVector {
public abstract float getX(); public abstract float getY();
public final float length() {
return Vectors.length(this);
}
// equals(Object), toString(), hashCode(), toImmutableVectors(), mutableCopy()
}
/** ImmutableVector, not modifiable implementation */
public final class ImmutableVector extends ReadableVector implements Serializable {
// getters
// guava-like builder methods (copyOf, of, etc.)
}
/** Mutable implementation */
public class Vector extends ReadableVector implements Serializable {
// fields, getters and setters
public void add (ReadableVector v) {/* delegate to Vectors */}
public void subtract(ReadableVector v) {/* delegate to Vectors */}
public void multiply(ReadableVector v) {/* delegate to Vectors */}
}
/** Tool class containing all the logic */
public final class Vectors {
public static ImmutableVector add(ReadableVector v1, ReadableVector v2) {...}
public static void addTo(Vector v1, ReadableVector v2) {...}
...
}

我将 Vector 从接口(interface)更改为抽象类,因为基本上 vector 不应该是其他任何东西。

谢谢大家。

最佳答案

作为您的 Vector 库的用户,我不希望有一个修改当前对象的 add 实现和另一个(相同接口(interface)的)add 实现返回一个新的。

最好有一组清晰的不修改当前对象的方法,然后在可变 vector 中有额外的方法来修改当前对象。

关于java - Java中不可变和可变对象的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5689695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com