Java 使用finally从setter返回旧值,不带临时变量

Java 使用finally从setter返回旧值,不带临时变量,java,finally,Java,Finally,我在Map.Entry中实现了V setValue(V value)方法,并完成了以下操作: @Override public T setValue(T value) { try { return this.value; } finally { this.value = value; } } 这是它应该做的 我知道关于最后块之类的东西有一些问题,但我找不到这个具体的问题。您对这个特定用例有什么想法?这合法吗?应该避免吗?如果是,那么为什么。谢谢 它是有效的,但它远不

我在
Map.Entry
中实现了
V setValue(V value)
方法,并完成了以下操作:

@Override public T setValue(T value) {
  try {
    return this.value;
  } finally {
    this.value = value;
  }
}
这是它应该做的


我知道关于
最后
块之类的东西有一些问题,但我找不到这个具体的问题。您对这个特定用例有什么想法?这合法吗?应该避免吗?如果是,那么为什么。谢谢

它是有效的,但它远不如以下内容那么明显(容易理解):


为什么不使用这个更简单的表单呢?

更喜欢简单明了的代码。i、 e

@Override public T setValue(T value) {
    T old = this.value;
    this.value = value;
    return old;
}
此外,这可以扩展为[本地]线程安全(如NIO
attach

私有最终原子参考值ref;
@覆盖公共T设置值(T值){
返回值REF.getAndSet(值);
}

好吧,我认为,到目前为止,这是绝对合法的。通常使用finally子句指定在返回之前分配的值。但有时我们会把它放在报税表内,并发出警告。我认为你必须避免这种返回,但是你可以使用finally来完成剩下的


否则,它就像是一个过时的函数,例如,不管您是将这些赋值放在finally块中还是try/catch块之后,它都不起作用。

有趣的模式-混淆代码。只有问题的标题告诉我们,代码实际上在做什么;)(老实说-我必须先阅读Tom和Jon的翻译才能看到发生了什么)注意:编译器仍在代码中创建一个临时(隐藏)变量。
AtomicReference
@Psycho_Dad NIO实际上在
attach
中使用了
AtomicReferenceFieldDupDater
,因为通常的用法是设置一次值,然后读取多次。使用更新程序意味着每个
选择键
(?)不需要携带
原子引用
@Override public T setValue(T value) {
    T old = this.value;
    this.value = value;
    return old;
}
private final AtomicReference<T> valueRef;

@Override public T setValue(T value) {
    return valueRef.getAndSet(value);
}