我正在V setValue(V value)
中实施Map.Entry<K,V>
方法并执行了以下操作:
@Override public T setValue(T value) {
try {
return this.value;
} finally {
this.value = value;
}
}
它可以正常工作。
我知道有一些关于finally
块和东西的问题,但我找不到这个具体问题。关于这个特定用例的你的想法是什么?这合法吗?应该避免?如果是,那么为什么或为什么不呢。谢谢!
答案 0 :(得分:4)
首选简单明了的代码。即。
@Override public T setValue(T value) {
T old = this.value;
this.value = value;
return old;
}
此外,这可以扩展为[本地]线程安全(如NIO attach
)。
private final AtomicReference<T> valueRef;
@Override public T setValue(T value) {
return valueRef.getAndSet(value);
}
答案 1 :(得分:3)
它有效,但它并不像以下那样明显(易于理解):
@Override public T setValue(T value) {
T oldValue = this.value;
this.value = value;
return oldValue;
}
为什么不使用这种更简单的形式?
答案 2 :(得分:0)
嗯,我认为,到目前为止,它绝对合法。通常,您使用finally子句指定在返回之前分配的执行o的值。但有时候我们会把它放在返回里面,然后会发出警告。我认为你必须避免这种回归,但你可以使用finally来做其余的事情。
否则,它就像一个过时的函数,无论你将这些赋值放在finally中还是在try / catch块之后都没有。