这个 class 是不可变的吗?

Is this class immutable?

这是class不可变的吗?

我大致尝试遵循 "Effective Java"、"Item 15: Minimize mutability" 中的指导方针,因此 class 并不是故意 "final"。

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

没有。 put 方法应该复制 Map,然后在副本上调用 put,然后 return 使用复制的地图构建一个新的 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);
}