使用finally从setter w / o temp变量返回旧值

时间:2011-05-18 12:39:03

标签: java finally

我正在V setValue(V value)中实施Map.Entry<K,V>方法并执行了以下操作:

@Override public T setValue(T value) {
  try {
    return this.value;
  } finally {
    this.value = value;
  }
}

它可以正常工作。

我知道有一些关于finally块和东西的问题,但我找不到这个具体问题。关于这个特定用例的你的想法是什么?这合法吗?应该避免?如果是,那么为什么或为什么不呢。谢谢!

3 个答案:

答案 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块之后都没有。