Зачем кому-то создавать дополнительную локальную переменную только для того, чтобы поместить в нее ключевое слово final?

Я столкнулся с кодом, подобным этому:

public void foo(String param1) { 
    final String param1F = param1;
    ...
}

Я сомневаюсь, что автор не знает, что он может поместить ключевое слово final непосредственно в сигнатуру метода, потому что в остальной части метода он использует только param1F, но мне любопытно, есть ли у кого-нибудь идея, для чего это может быть полезно?


person draganstankovic    schedule 20.06.2010    source источник
comment
Не могли бы вы спросить их напрямую?   -  person Pete Kirkham    schedule 20.06.2010
comment
Определены ли какие-то внутренние методы?   -  person Pentium10    schedule 20.06.2010
comment
Я не могу спросить их напрямую, потому что это проект, найденный на sourceforge, и последняя активность была год назад, поэтому я предположил, что это будет более быстрый способ узнать мнение.   -  person draganstankovic    schedule 21.06.2010
comment
Да, есть внутренние методы, и поэтому им нужно использовать ключевое слово final, но меня беспокоит то, почему они просто не поместили ключевое слово final в параметры метода...   -  person draganstankovic    schedule 21.06.2010


Ответы (3)


В этом случае вы могли бы переназначить param1, что было бы невозможно, если бы param1 было окончательным.

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

person Andreas Dolk    schedule 20.06.2010
comment
Хорошо, я так и думал в начале, поэтому я проверил остальную часть кода на предмет различного использования param1 и param1F, но ничего подобного не было, а затем я хотел узнать мнение других людей на случай, если я что-то пропустил :) - person draganstankovic; 21.06.2010
comment
Так что, возможно, это просто вопрос (личного) стиля кодирования. Иногда люди используют некоторые шаблоны просто для повышения читабельности или для соблюдения некоторых (странных) правил кодирования компаний... - person Andreas Dolk; 21.06.2010
comment
Я согласен (на самом деле это может быть второй наиболее вероятной причиной), но, учитывая обстоятельства проекта, который я наблюдал, я приду к выводу, что авторы не знали, что они могут ставить ключевое слово final в сигнатуре метода :) - person draganstankovic; 21.06.2010

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

Runnable f(int i) {
    final int i2 = i;
    return new Runnable() {
        public void run() {
            System.out.println(i2);
        }
    };
}
person agsamek    schedule 20.06.2010
comment
не совсем - это тоже сработало бы, если бы i был окончательным и использовался в анонимном классе. - person Andreas Dolk; 20.06.2010
comment
@Andreas_D - конечно. Либо мне нужно быть окончательным, либо переназначить конечную переменную. - person agsamek; 20.06.2010
comment
на самом деле вопрос заключался в том, зачем переназначать, когда можно сказать: f(final int i) { .... - person draganstankovic; 21.06.2010

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

person irreputable    schedule 20.06.2010
comment
Затем вы должны объявить их окончательными, потому что тогда это приведет реальность в соответствие с тем, как, по вашему мнению, все должно быть. - person Chuck; 20.06.2010
comment
это не только ты, это все фашисты из чекстайла пытаются навязать это всем. круто то, что они никогда не будут окончательными, и вам придется жить с этим так же, как мы должны жить с такими глупыми правилами, как этот. плюс, если вы не понимаете, как работает java, даже если вы сделаете их одноэлементными, это вам не поможет. - person IAdapter; 20.06.2010