Верните старое значение из установщика без временной переменной, используя наконец
Вопрос
я реализовал 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.