这个类是不可变的吗?
我大致试图遵循“有效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();
}
}
答案 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);
}