Java и использование ключевого слова Final - PullRequest
4 голосов
/ 30 декабря 2011

Я новичок в Java, программируя на Delphi и C # в течение некоторого времени. Мой вопрос связан с использованием ключевого слова "final" в переменной, в которой содержится экземпляр класса, когда объявление и создание переменной происходят в рамках одного и того же метода. например

private String getDeviceID() {
   //get the android device id
   final TelephonyManager tm =                
     (TelephonyManager)GetBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
   final String deviceID = tm.getDeviceId();

   // log debug message containing device ID
   Log.d(LOG_CAT, "getDeviceID: " + deviceID);        

   return deviceID;
}

хорошо, так что я думаю, что я понимаю, что переменные "final" могут быть назначены только один раз и не могут быть изменены из-за ключевого слова "final" в каждом объявлении, но обе переменные не выходят из области видимости, когда метод выхода? и повторный вызов метода просто перераспределит 2 новые конечные переменные, которые снова выйдут из области видимости при выходе из метода?

Мне кажется странным использовать ключевое слово final для этих переменных? разве я не понимаю, как они влияют на локальные переменные в рамках метода?

Может ли кто-то просветить меня относительно влияния "финала" в отношении области применения метода, или объявляет эти конкретные переменные как финал просто глупостью, которую кто-то сделал?

Ответы [ 8 ]

6 голосов
/ 30 декабря 2011

final не влияет на область действия.
Это просто предотвращает повторное присвоение переменной.

Он служит сигналом для других разработчиков о том, что эти переменные никогда не изменятся, и предотвращает их случайное изменение.
Это особенно полезно в более длинных методах.

final также требуется для использования переменной в анонимном внутреннем классе, поскольку Java не поддерживает истинные замыкания.

5 голосов
/ 30 декабря 2011

Эти переменные действительно будут собраны сборщиком мусора, как только GC запустится при выходе из метода.

Ключевое слово final действительно есть как подсказка: эта переменная создается один раз, вам не следует трогатьэто в теле самого метода.Точно так же объявление параметров метода final запрещает их повторное использование (что, imho, хорошо).

Обратите внимание, однако, что ключевое слово влияет только на ссылку на объект: это не означает, что методы на этой ссылке на объект, которыеизменение его внутреннего состояния перестанет работать (типичный пример: setters).

Еще одно примечание: когда вы опускаете ключевое слово final и не изменяете переменную в теле вашего метода, JVMдостаточно умен, чтобы оптимизировать этот случай.Таким образом, вы можете опустить это.Независимо от того, используете ли вы его, и где вы его используете, это вопрос вкуса / стиля кодирования.

И, наконец, рекомендуется объявить public static переменные как окончательные: в противном случае все может изменить это.!Думайте о строковых константах и ​​т. Д.

1 голос
/ 30 декабря 2011

В области действия локальной переменной или параметра final нет ничего особенного.

Объявление локальной переменной или параметра как final на самом деле мало что дает и редко требуется.На это есть две основные причины:

  1. Некоторые разработчики считают, что все, что не должно быть изменяемым, должно быть неизменным.Хотя я согласен в принципе (неизменность - хорошая вещь во многих отношениях), я думаю, что для такого языка, как Java, объявление всего final идет за борт.
  2. Если ваш метод содержит локальный или анонимный внутренний класси вы хотите, чтобы любая из его локальных переменных или параметров была доступна для кода во внутреннем классе, вы должны объявить их final.Это ключ к языку Java;его цель - предотвратить попытки кода во внутреннем классе изменить переменные или параметры после того, как они больше не работают.
0 голосов
/ 30 декабря 2011

Чрезмерно религиозные программисты скажут вам отмечать final на локальных переменных (включая параметры метода), когда вы можете.

На практике это никто не делает, включая программистов.

Не беспокойся.

0 голосов
/ 30 декабря 2011

Моя перспектива

Хорошей практикой (для лучшего обслуживания и т. Д.) Является определение локальных переменных в качестве окончательных. Это один из способов уменьшения побочных эффектов . Код без побочных эффектов легко рассуждать и, следовательно, более читабелен и прост в обслуживании.

0 голосов
/ 30 декабря 2011

читаемость


Когда дело доходит до локальной области, я обнаружил, что ее использование является переменным. То есть некоторые программисты решат использовать его (и злоупотреблять им ... как я), а некоторые будут использовать его экономно (например, чтобы гарантировать, что класс не может быть разделен на подклассы, неизменяемость и т. Д.).

Я считаю, что при работе с группой разработчиков это либо все, либо ничего. Как только вы начинаете включать модификаторы final в локальную область, вы знаете, что вы зацепили, и ваша команда мало что может сделать (кроме как уволить вас ... каким-то образом ... за то, что вы эффективны ). разработчик).

0 голосов
/ 30 декабря 2011

final похоже на const в c для примитивов и ссылок.

0 голосов
/ 30 декабря 2011

Они являются окончательными в том объеме, в котором они находятся. Так оно и есть.

Я полагаю, что цель сделать их окончательными в этом случае - не дать будущим разработчикам изменить их, когда они не должны быть изменены. В данном случае это просто защитное кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...