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

シンプルでわかりやすいコードを好みます。すなわち

@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 内に配置するか、try/catch ブロックの後に配置するかは問題ではありません。

于 2011-05-18T12:45:33.517 に答える