Создание аргументов java-метода в качестве окончательного

Какая разница между заключительным кодом между приведенным ниже кодом. Есть ли преимущество в объявлении аргументов как окончательных.

public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){ return .... } public String changeTimezone(final Timestamp stamp, final Timezone fTz, final Timezone toTz){ return .... } 

Поскольку параметр формального метода является локальной переменной, вы можете получить к ним доступ из внутренних анонимных classов, только если они объявлены окончательными.

Это избавит вас от объявления другой локальной конечной переменной в теле метода:

  void m(final int param) { new Thread(new Runnable() { public void run() { System.err.println(param); } }).start(); } 

Выдержка из последнего слова по ключевому слову final

Конечные параметры

Следующий образец объявляет конечные параметры:

 public void doSomething(final int i, final int j) { // cannot change the value of i or j here... // any change would be visible only inside the method... } 

final используется здесь, чтобы гарантировать, что два индекса i и j не будут случайно сброшены методом. Это удобный способ защиты от коварной ошибки, которая ошибочно меняет стоимость ваших параметров. Вообще говоря, короткие методы – лучший способ защитить от этого classа ошибок, но конечные параметры могут быть полезным дополнением к вашему стилю кодирования.

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

Финал не позволяет вам получить новое значение переменной, и это может быть полезно при улавливании опечаток. Стилистически вам может нравиться сохранять неизмененные параметры и присваивать только локальные переменные, поэтому окончательный вариант будет способствовать соблюдению этого стиля.

Должен признаться, я редко помню, чтобы использовать final для параметров, может быть, я должен.

 public int example(final int basicRate){ int discountRate; discountRate = basicRate - 10; // ... lots of code here if ( isGoldCustomer ) { basicRate--; // typo, we intended to say discountRate--, final catches this } // ... more code here return discountRate; } 

Это не имеет большого значения. Это просто означает, что вы не можете писать:

 stamp = null; fTz = new ...; 

но вы все равно можете написать:

 stamp.setXXX(...); fTz.setXXX(...); 

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

Последнее ключевое слово, используемое для параметров / переменных в Java, обозначает ссылку как окончательную. В случае передачи объекта другому методу система создает копию ссылочной переменной и передает ее методу. Отметив новые ссылки final, вы защитите их от переназначения. Иногда это считается хорошей практикой кодирования.

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

Его просто конструкция на Java, чтобы помочь вам определить контракт и придерживаться его. Аналогичная дискуссия здесь: http://c2.com/cgi/wiki?JavaFinalConsideredEvil

BTW – (как говорит twiki), обозначение args как final обычно является избыточным, если вы следуете хорошим принципам программирования, и hance выполнил переназначение / переопределение ссылки на входящие аргументы.

В худшем случае, если вы переопределите ссылку args, это не повлияет на фактическое значение, переданное функции, поскольку передано только эта ссылка.

Я говорю о разметке переменных и полей final в целом – не просто применяется к аргументам метода. (Маркеры / classы окончательные совсем другое).

Это услуга для читателей / будущих сопровождающих вашего кода. Вместе с разумным именем переменной полезно и уверенно читать читателю вашего кода, чтобы увидеть / понять, что представляют собой переменные, о которых идет речь, – и это убеждает читателя, что всякий раз, когда вы видите переменную в той же области действия, смысл остается то же самое, поэтому (а) он не должен почесывать голову, чтобы всегда понять, что означает переменная в каждом контексте. Мы видели слишком много злоупотреблений «повторного использования» переменных, что делает даже короткий fragment кода трудно понять.

Последнее ключевое слово не позволяет назначить новое значение параметру. Я хотел бы объяснить это простым примером

Предположим, что у нас есть метод

метод1 () {

Дата dateOfBirth = новая дата («1/1/2009»);

метод2 (DateOfBirth);

method3 (DateOfBirth); }

public mehod2 (Дата dateOfBirth) {
….
….
….
}

public mehod2 (Дата dateOfBirth) {
….
….
….
}

В приведенном выше случае, если «dateOfBirth» присваивается новое значение в методе 2, это приведет к неправильному выводу метода method3. Поскольку значение, которое передается методу3, не является тем, что было перед передачей методу2. Поэтому, чтобы избежать этого ключевого слова final, используется для параметров.

И это также одна из лучших практик Java Coding.

  • В чем разница между методами classа и экземпляра?
  • Ошибка компилятора: ссылка на вызов неоднозначную
  • Объект Bound и unbound method в Python
  • Как перехватить вызов метода со стандартными функциями Java (без AspectJ и т. Д.)?
  • Динамически заменить содержимое метода C #?
  • как добиться сцепления метода в java?
  • Что означает class в Java?
  • Ошибка «Отсутствие экземпляра типа» при вызове метода из другого classа в Android
  • Когда метод finalize () вызывается в Java?
  • Как вызвать метод в java?
  • друг И встроенный метод, в чем смысл?
  • Давайте будем гением компьютера.