防御性复制Number子类

Pao*_*oni 7 java generics

请考虑以下示例:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了使这个类不可变,我必须防御性地复制传递给构造函数的任何可变参数,并创建由公共方法返回的内部可变对象的副本.

这可能吗?如果没有,是否有任何解决方法?

Ren*_*ink 3

由于所有Numbers 都是Serializable您可以通过它们创建副本serializing/deserializing

也许你可以使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果您想自己实现它,请查看: