Зачем объявлять аргумент функции как окончательный? - PullRequest
56 голосов
/ 08 февраля 2011

В настоящее время я работаю над книгой "Научись разрабатывать приложения для Android за 24 часа", изданной Sams. Я относительно новичок в Java, Android или иначе. У меня очень солидный опыт работы с ActionScript 3, у которого достаточно сходства с Java, и сам язык не так сложен для понимания, но у меня все еще есть некоторые вопросы относительно обоснования некоторых примеров кода в книге. Например, вот функция, которая поставляется с примером кода для Часа 9:

private void processScores(final TableLayout scoreTable, 
      XmlResourceParser scores) throws IOException, XmlPullParserException{

В этой подписи функции авторы объявили аргумент ScoreTable как окончательный. Я немного озадачен тем, почему они это сделали. Мне даже в голову не пришло бы попытаться присвоить новое значение аргументу функции ScoreTable (это считается плохой практикой в ​​ActionScript). Кроме того, на самом деле я не видел, чтобы кто-то делал это в реальных Java, которые я исследовал или перенес в AS3.

Есть ли что-то конкретное в разработке для Android, что делает необходимым иногда объявлять определенные аргументы функции как окончательные?

Почему объект TableLayout объявлен как final, а не XmlResourceParser?

1 Ответ

89 голосов
/ 08 февраля 2011

Есть две основные причины, по которым вы можете захотеть отметить аргумент final.Во-первых, если вы планируете использовать аргумент в анонимном внутреннем классе, вы должны пометить его final, чтобы на него можно было ссылаться в этом классе.На самом деле это довольно распространенный вариант использования для обозначения аргументов final.

Другая распространенная причина пометить аргументы final - это предотвратить случайную их перезапись.Если вы действительно не хотите изменять аргументы, то, возможно, вам следует пометить их final, так что если вы действительно это сделаете, вы получите ошибку во время компиляции, а не узнаете во время выполнениячто в вашем коде есть ошибка.

...