Почему параметры метода переназначаются локальными переменными?

При просмотре исходного кода 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 сделает это ясным.