2016-07-01 4 views
1

В swift рекомендуется объявить переменную с ключевым словом let, если переменная не изменится после инициализации. Я вижу много переменных, объявленных как let.Почему переменная Java чаще объявляется как «final»? Сравнение с ключевым словом в swift

В java, я думаю, что ключевое слово final может служить той же цели. Но из моего ограниченного опыта я вижу только людей, объявляющих переменные как final в редких обстоятельствах, например. ПИ.

Почему переменная Java объявлена ​​как final чаще? Есть что-то, что мне не хватает?

+5

Потому что это дополнительная набивка, а программисты ленивы. Но если вы используете IDE, у него, вероятно, есть функция «автоматически добавлять финал, где это возможно», когда вы сохраняете файл. – Thilo

+1

Потому что люди ленивы. 'final' является _required_ pre Java 8 для закрытий, но, кроме этого, редко используется. Я и [Роберт Симмонс-младший] (http://shop.oreilly.com/product/9780596005689.do) выступают за его принятие.Основная причина заключается в том, что он отфильтровывает некоторые глупые опечатки во время компиляции. Но поскольку это не влияет на время работы программы, в отличие от 'const' на C++, аргументация для дополнительного ввода и кодового шума отсутствует достаточно для многих людей. –

+0

@Thilo так просто, как let ключевое слово в swift, я должен объявить переменную java final evenverever possible? – Thor

ответ

5

см In Java, should I use “final” for parameters and locals even when I don't have to?

В основном, для полей, это полезно, а также изменения их свойств параллельности. см. Java concurrency: is final field (initialized in constructor) thread-safe?

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

public void foo (final int x, final int y){ 
    try{ 
     final int z = x+y; 
    } 
    catch (final Exception z){ 
     final String message = ""; 
     throw new RuntimeException(message); 
    } 
} 

по сравнению с

public void foo (int x, int y){ 
    try{ 
     int z = x+y; 
    } 
    catch (Exception z){ 
     String message = ""; 
     throw new RuntimeException(message); 
    } 
} 

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

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

+0

", в то время как другие предпочитают не использовать его из-за его многословия". Для многих людей это относится к Java в целом :-) – Thilo

+0

@Thilo: Ну, правда, но поскольку Java уже довольно многословна, вам не нужно делать это еще более подробным, если не нужно :) – user140547

3

Java следует традиционному стилю мышления C, где, если мы что-то создаем (примитивные типы или объекты), по умолчанию это переменная, и вам нужно поставить put «final» в java и «const» в C/C++, чтобы сделать это постоянная. Swift является очень новым по сравнению с этими языками, и его цели - безопасные шаблоны программирования и простота. Если вы приобретете дополнительный опыт работы на Java, вы узнаете, что люди чаще используют конечные и лучшие практики. Основная причина, по которой я думаю (как вы уже упоминали), - это ограничить доступ к Java.

2

Инициализировать переменную с помощью final в компиляторе Java, чтобы убедиться, что вы можете инициализировать ее только один раз. Если это примитивный тип, например int или doubles, он может гарантировать, что значение не может измениться. Однако для Objectfinal относится только к самой ссылке, а не к содержимому ссылочного объекта. Он не гарантирует, что значения внутри объекта будут оставаться неизменными.

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

final List<String> foo = new ArrayList<String>(); 

выше Listfoo не может быть инициализирован снова, но его содержание может быть изменено, то есть он не делает foo неизменны. Следовательно, это делает final ключевое слово менее полезным.

final ключевое слово имеет свое место в объявлении постоянного значения, особенно если требуется только один экземпляр класса с использованием ключевого слова static.Ниже приведен пример в java.util.Random.Math:

public final class Math { 

    public static final double PI = 3.14159265358979323846; 
2

Почему не переменная Java объявлена ​​как финал чаще? Есть что-то, что мне не хватает?

Что вам не хватает, это «человеческая природа».

Просто синтаксис Java упрощает НЕ добавлять final. И вообще, людей нет, потому что легче не делать этого.

Обратите внимание, что «переменные не являются окончательными по умолчанию», дизайнерское решение исходит из предков Java.


Конечно, это не решает ваш подразумеваемый вопрос о том, является ли Java программисты должны использовать final чаще . Но это вопрос мнения, и StackOverflow обескураживает мнения Q & A.

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

+0

Это также относится к классы и методы, которые, по мнению некоторых, должны быть «окончательными» по умолчанию. – shmosel

+0

Да ... хотя это другая проблема. Там вы имеете дело с проблемой обрыва абстракции из-за наследования. –

+0

@shmosel Вы должны объявить методы 'final', где это возможно (пока вы не отмените его). В противном случае они по умолчанию виртуальны, и есть потеря производительности. –

1

Я думаю, это потому, что в Java нет такой «традиции».

Вы видите, что первая книга, которую я прочитал о Swift (Swift Programming Language 2.0 от Apple Inc.), говорит, что каждая создаваемая вами переменная, которая не является мутированной, должна быть объявлена ​​как константа let.

Поскольку Swift Язык программирования 2.0 (книга) является официальным справочником по Swift, почти все следуют за ним. Даже если люди не читают эту книгу, они будут читать учебники, написанные людьми, которые прочитали эту книгу. В результате, стиль кодирования каждого выглядит так.

Напротив, первая книга, которую я прочитал о Java (Программирование с Java для чайников), не подчеркивает, что мы должны использовать final, если значение не изменится. И официальные документы редко делают это. Таким образом, только несколько программистов следуют этому правилу. Это привело к тому, что большинство пишет код, который фактически следует этому правилу.

Кроме того, вы должны написать еще 5 символов (слово «final» плюс пробел), чтобы объявить константу в Java, тогда как в Swift вы не записываете никаких дополнительных символов (var и пусть имеют одинаковые количество символов)! Программисты ленивы, знаешь.

1

По крайней мере, исходя из моего опыта, мне говорят, что рекомендуется использовать final, если переменная не изменяется после инициирования. Для примитивного типа JVM будет рассматривать его как постоянный и делать некоторую оптимизацию.

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