这个 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);
}
这是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);
}