Зачем в статическом методе делать локальные переменные финальными?
1,00
р.
р.
В одном из стандартных примеров — SampleSyncAdapter — есть такой фрагмент: public static boolean authenticate(String username, String password, Handler handler, **final Context context**) { **final HttpResponse resp ** **final ArrayList params = new ArrayList() ** params.add(new BasicNameValuePair(PARAM_USERNAME, username)) params.add(new BasicNameValuePair(PARAM_PASSWORD, password)) HttpEntity entity = null try { entity = new UrlEncodedFormEntity(params) } catch (**final UnsupportedEncodingException e**) { // this should never happen. throw new AssertionError(e) } **final HttpPost post = new HttpPost(AUTH_URI) ** ... Далее также некоторые переменные помечены как final. Зачем?
Ответ Дело не в статическом методе, final может использовать везде. Есть 2 причины использования final: Когда компилятор встречает ключевое слово final, то он пытается делать оптимизацию кода имея ввиду, что значение этой переменной далее не будет меняться. Кое-какие копейки (экономия стека или быстродействия) за счет такой оптимизации можно выиграть. Кроме того программист сознательно может использовать слово final с тем, чтобы контролировать уже на этапе компиляции будет меняться его значение или нет. То есть если будет попытка модификации присвоенного при инициализации значения компилятор выдаст ошибку. Некоторым девелоперам кажется, что это айс. Эта переменная будет захватываться анонимным классом (Верно для версий меньших 8). Для того что бы захватить переменные в контекст они должны быть помечены как final. Начиная с 8 версии компилятор сам может определять является ли переменная неизменяемой (effectively final) и ключевое слово становиться необязательно.