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);
    }
}

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

  • 克隆可序列化和不可序列化的Java对象

  • 您需要克隆该对象。 所以你的代码看起来像这样:

    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

    上一篇: Defensive copying of Number subclass

    下一篇: CSS hack for Opera Mini only