Number子类的防御性复制
请考虑下面的例子:
public final class ImmutableWrapper<T extends Number> {
private final T value;
public ImmutableWrapper(T value) {
// a subclass of Number may be mutable
// so, how to defensively copying the value?
this.value = value;
}
public T getValue() {
// the same here: how to return a copy?
return value;
}
}
为了使这个类不可变,我必须防御性地复制传递给构造函数的任何可变参数,并创建由公共方法返回的内部可变对象的副本。
这可能吗? 如果没有,是否有任何解决方法?
由于所有Number
都是可Serializable
您可以通过serializing/deserializing
Serializable
来创建副本。
也许你可以使用apache commons-lang的SerializationUtils.clone(Serializable)
。
public final class ImmutableWrapper<T extends Number> {
private final T value;
public ImmutableWrapper(T value) {
// a subclass of Number may be mutable
// so, how to defensively copying the value?
this.value = SerializationUtils.clone(value);
}
public T getValue() {
// the same here: how to return a copy?
return SerializationUtils.clone(value);
}
}
或者如果你想自己实现它,请看看:
您需要克隆该对象。 所以你的代码看起来像这样:
public final class ImmutableWrapper<T extends Number> {
private final T value;
public ImmutableWrapper(T value) {
this.value = value.clone();
}
public T getValue() {
return value.clone();
}
}
链接地址: http://www.djcxy.com/p/18997.html