这个类是不可变的吗?

时间:2016-08-12 12:24:13

标签: java immutability

这个类是不可变的吗?

我大致试图遵循“有效Java”,“第15项:最小化可变性”中的指导原则,因此该课程并非故意“最终”。

public class Result<T extends Number> {
    private final Map<String, T> result;

    private Result(final Map<String, T> result) {
        this.result = result;
    }

    public static final Result<? extends Number> of() {
        return new Result<>(new LinkedHashMap<>());
    }

    /** Add or replace value. */
    public Result<T> put(final String key, final T value) {
        result.put(key, value);
        return new Result<>(Collections.unmodifiableMap(result));
    }

    public T get(final String key) {
        return Collections.unmodifiableMap(result).get(key);
    }

    @Override
    public String toString() {
        return result.toString();
    }
}

1 个答案:

答案 0 :(得分:4)

没有。 put方法应复制Map,然后在副本上调用put,并返回使用复制的地图构建的新Result

/** Add or replace value. */
public Result<T> put(final String key, final T value) {
    Map<T> copy = new LinkedHashMap<>(result);
    copy.put(key, value);
    return new Result<>(copy);
}

请注意,该实现还依赖于Number的所有子类都是不可变的。否则,get方法的实施也存在问题。

public T get(final String key) {
    //Relies on T being immutable
    return result.get(key);
}