Верните старое значение из установщика без временной переменной, используя наконец

StackOverflow https://stackoverflow.com/questions/6044769

  •  15-11-2019
  •  | 
  •  

Вопрос

я реализовал V setValue(V value) метод в Map.Entry<K,V> и сделали следующее:

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

Он работает так, как должен.

Я знаю, что есть некоторые вопросы по поводу finally блоки и прочее, но я не смог найти этот конкретный вопрос.Что твой мысли об этом конкретном варианте использования?Это законно?Необходимо избегать?Если да, то почему или почему нет.Спасибо!

Это было полезно?

Решение

Предпочитайте простой и очевидный код.то есть

@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);
}

Другие советы

Это работает, но это не так очевидно (легко понять), как:

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

Почему бы не использовать эту более простую форму?

Ну, я думаю, что на данный момент это абсолютно законно.Обычно вы используете предложениеfinally, чтобы указать значения, которые выполняются o, назначаются непосредственно перед возвратом.Но иногда мы используем return, и выдается предупреждение.Я думаю, вам следует избегать этого возврата, но для остального вы можете использовать, наконец.

В противном случае это похоже на устаревшую функцию, например, и не имеет значения, помещаете ли вы эти присваивания внутри блокаfinally или после блока try/catch.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top