Передается ли финальная переменная в Java с другой стороны? - PullRequest
8 голосов
/ 19 февраля 2010

Я только что наткнулся на какой-то код, который меня немного смущает; Есть действительно 2 варианта, которые я хотел бы уточнить.

Пример 1:

public String getFilepath(){
        final File file = new File(this.folder, this.filename);
        return file.getAbsolutePath();
    }

Какова цель объявления file "final"? Поскольку примитивы Java передаются по значению, а getAbsolutePath() просто возвращает String, переменная не будет final с другой стороны (вызов метода), не так ли? И поскольку переменная file существует только в пределах этих двух строк, я не вижу цели ключевого слова final. Я что-то упускаю? Кто-нибудь видит причину сделать это?

Пример 2:

public String getFilepath(){
        final File file = new File(this.folder, this.filename);
        return file;
    }

Так как здесь фактический объект возвращается ... Означает ли это, что переменная file будет постоянной / final на другой стороне ...? Кажется, это не имеет смысла.

В общем, мне кажется, что вы передаете переменную, без это тип доступа. Например, у меня может быть переменная private в функции с функцией get public, которая возвращает ее, но переменная, которая получает ее при вызове функции, должна указать модификатор доступа. Так что, если он указывает public, возвращаемая переменная будет public в этой области. Если он указывает private, возвращаемая переменная будет private в этой области. Есть ли разница с final? Является ли «постоянство» переменной чем-то, что может быть передано? Это кажется мне невероятным, учитывая то, что я знаю о Java.

Или я упускаю суть целиком, и в приведенном выше коде есть какая-то другая цель ключевого слова final? 1038 *

Edit:

Я сверился с первоначальным разработчиком, который написал код, и он сказал, что вводит только ключевое слово final, потому что он изначально думал, что метод будет намного длиннее, и хотел убедиться, что файл остается постоянным на протяжении всего процесса. Он также сказал, что он обычно объявляет переменные, которые не должны быть изменены, как final, как правило, по всем правилам и в некотором роде в принципе - точка, в которой оба ответа упомянуты ниже. Похоже, я слишком много читал в простом дополнительном ключевом слове, включенном по стандартным причинам Спасибо всем!

Ответы [ 2 ]

15 голосов
/ 19 февраля 2010

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

3 голосов
/ 19 февраля 2010

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

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

Помните, что объявление переменной final не делает ссылочный объект неизменным. Это просто означает, что переменная не может иметь переназначенное значение. Вы по-прежнему можете запускать методы переменной file, которые могут внутренне изменить объект File.

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

...