Создание аргументов метода java как окончательных
какая разница, что окончательный делает между кодом ниже. Есть ли какое-либо преимущество в объявлении аргументов окончательными.
public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){
return ....
}
public String changeTimezone(final Timestamp stamp, final Timezone fTz,
final Timezone toTz){
return ....
}
9 ответов:
поскольку формальный параметр метода является локальной переменной, вы можете получить доступ к ним из внутренних анонимных классов только в том случае, если они объявлены как окончательные.
это избавляет вас от объявления другой локальной конечной переменной в теле метода:
void m(final int param) { new Thread(new Runnable() { public void run() { System.err.println(param); } }).start(); }
выписка из последнее слово на последнем ключевом слове
Окончательные Параметры
в следующем примере объявляются окончательные параметры:
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 не случайно будут сброс по методу. Это удобный способ для защиты от коварного жука это ошибочно изменяет значение ваш параметр. Вообще говоря, короткий методы лучший способ защиты от этого класса ошибок, но окончательные параметры могут быть полезны дополнение к вашему стилю кодирования.
обратите внимание, что окончательные параметры не являются рассматривать как часть метода подпись, и игнорируются компилятор при разрешении вызовов методов. Параметры могут быть объявлены (или нет) без влияния на то, как метод переопределен.
финал не позволяет вам определить новое значение переменной, и это может быть полезно при ловле опечаток. Стилистически вы можете сохранить полученные параметры неизменными и назначить только локальные переменные, поэтому final поможет применить этот стиль.
должен признать, что я редко помню, чтобы использовать 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(...);это в основном подсказка программисту обслуживания, который следует за вами, что вы не собираетесь назначать новое значение параметру где-то в середине вашего метода, где это не очевидно и поэтому может вызвать путаницу.
ключевое слово final при использовании для параметров / переменных в Java отмечает ссылку как final. В случае передачи объекта другому методу система создает копию ссылочной переменной и передает ее методу. Отмечая новые ссылки окончательно, вы защищаете их от переназначения. Это считается иногда хорошей практикой кодирования.
для тела этого метода
finalключевое слово предотвратит случайное переназначение ссылок аргументов, что приведет к ошибке компиляции в этих случаях (большинство IDE сразу же пожалуются). Некоторые могут утверждать, что с помощьюfinalв целом, когда это возможно, ускорит работу, но это не так в последних JVMs.
Это просто конструкция в Java, чтобы помочь вам определить контракт и придерживаться его. Аналогичное обсуждение здесь : http://c2.com/cgi/wiki?JavaFinalConsideredEvil
BTW - (как говорит twiki), маркировка args как final обычно избыточна, если вы следуете хорошим принципам программирования, и hance done переназначает / переопределяет входящую ссылку аргумента.
в худшем случае, если вы переопределите ссылку args, это не повлияет на фактическое значение передано в функцию-так как была передана только ссылка.
Я говорю о маркировке переменных и полей final в целом-это относится не только к аргументам метода. (Методы маркировки / классы final-это совсем другое дело).
Это услуга для читателей / будущих сопровождающих вашего кода. Вместе с разумным именем переменной полезно и обнадеживает читателя вашего кода, чтобы увидеть / понять, что представляют собой переменные, о которых идет речь, - и это обнадеживает читателя, что всякий раз, когда вы видите переменную в одном и том же объем, значение остается неизменным, поэтому ему не нужно почесывать голову, чтобы всегда выяснить, что означает переменная в каждом контексте. Мы видели слишком много злоупотреблений" повторного использования " переменных, что делает даже короткий фрагмент кода трудно понять.
ключевое слово final не позволяет присвоить новое значение параметру. Я хотел бы объяснить это простым примером
Предположим у нас есть метод
method1 () {
дата dateOfBirth =новая дата("1/1/2009");
method2 (dateOfBirth);
method3(dateOfBirth); }
public mehod2 (Date dateOfBirth) {
....
....
....
}public mehod2 (Date dateOfBirth) {
....
....
....
}в приведенном выше случае, если" dateOfBirth " присваивается новое значение в method2, чем это приведет к неправильному выходу из method3. Поскольку значение, которое передается в method3, не является тем, что было до передачи в method2. Поэтому, чтобы избежать этого, последнее ключевое слово используется для параметров.
и это также один из лучших кодировщиков Java Практика.
Comments