Почему параметры метода переназначаются локальными переменными?
При просмотре исходного кода Java API я часто вижу параметры метода, переназначенные локальным переменным. Почему это когда-либо сделано?
void foo(Object bar) {
Object baz = bar;
//...
}
Это в java.util.HashMap
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
Ответы
Ответ 1
Это правило безопасности потоков/повышения производительности. values
в HashMap
является изменчивым. Если вы назначаете переменную локальной переменной, она становится локальной переменной стека, которая автоматически потокобезопасна. И многое другое, изменение локальной переменной стека не заставляет "происходить-раньше", поэтому при его использовании нет штрафа за синхронизацию (в отличие от изменчивости, когда каждая запись/запись будет стоить вам при приобретении/освобождении блокировки)
Ответ 2
Мне нужно посмотреть на некоторые реальные примеры, но единственная причина, по которой я могу это сделать, - это сохранить исходное значение для некоторых вычислений в конце метода. В этом случае объявление одной из "переменных" final
сделает это ясным.