2

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

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

它可以正常工作。

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

4

3 回答 3

4

更喜欢简单、明显的代码。IE

@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);
}
于 2011-05-18T12:42:35.093 回答
3

它有效,但并不像以下那样明显(易于理解):

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

为什么不使用这种更简单的形式?

于 2011-05-18T12:42:05.807 回答
0

嗯,我认为,目前,这绝对是合法的。通常,您使用 finally 子句指定执行 o 的值在返回之前分配。但有时我们使用在 return 里面放,并抛出一个警告。我认为您必须避免返回,但您可以使用 finally 其余部分。

否则,例如,它就像一个过时的函数,无论您将这些分配放在 finally 中还是在 try/catch 块之后。

于 2011-05-18T12:45:33.517 回答