Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Почему const и goto не используются в java?

#java #синтаксис #константа #goto


Давайте поговорим о двух зарезервированных, но неиспользуемых ключевых словах языка
Java — const и goto. Почему они не используются? Как я понял const можно заменить на
public static final, но как быть с goto?
    


Ответы

Ответ 1



Обновление В спецификации Java (§3.9. Keywords) указана причина резервирования const и goto, не связанная с планами на будущее: The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs. Ключевые слова const и goto зарезервированы, хотя на данный момент не используются. Это позволит компилятору Java выводить более ясные сообщения об ошибках если эти ключевые слова C++ будут неправильно использоваться в программах. Т.о. разработчики Java изначально не имели планов использовать эти слова, а зарезервировали их чтобы отловить ошибки при копировании кода, написанного на C++ (если бы переменные можно было бы назвать goto либо const, то скопированный код C++ мог ошибочно пройти компиляцию и привести к неожиданным результатам при исполнении). Эта часть спецификации не изменялась с первого издания JLS. Ниже первоначальная версия ответа, в которой рассматриваются попытки найти применение для const и goto в Java. Многа букав: const и goto перешли из C++. Ключевым словам не нашли применения в Java. Функции, которые они выполняют в C++, в Java реализованы по-другому. История Исторически синтаксис Java основан на C++, поэтому разработчики приняли решение зарезервировать ряд ключевых слов C++, чтобы: отловить ошибки при копировании кода, написанного на C++; использовать их в дальнейшем при расширении языка; упростить переход на Java для C++-разработчиков. const и goto Таким образом вопрос сводиться к следующему: «Есть ли в Java необходимость в const и goto и что они должны делать?» const Одно из предложений ввести const по аналогии с C++ можно посмотреть по ссылке: JDK-4211070 : Java should support const parameters (like C++) for code maintainence Предложение было закрыто в 2005 году. По ссылке можно посмотреть разбор, в выводах которого отмечаются проблемы, связанные вводом const: Adding const is too late now. Had this been added from 1.0, the situation could have been different. Const pollution: the C++ approach requires all const methods to be marked with a const keyword. This means that most methods will have to be marked const explicitly. This tend to clutter all methods in C++. Compatibility is a very important feature of the JDK. Arguably, the collection classes should be modified to indicate that the elements are const. That would require all existing implementations to be updated in the same way, effectively breaking all existing non-JDK implementations of the collection interfaces. Similarly, hashCode would have to be const, breaking the current implementation of String. Создание константных переменных/полей в Java уже обеспечивается с помощью final. Ввод механизмов из C++ посчитали неоправданным. goto У goto плохая репутация (см. «Go To Statement Considered Harmful» Дейкстры). В Java имеются альтернативные операторы перехода: break, continue, return, которые покрывают большую часть области применения. Единственный довод в пользу goto состоит в том, что в отдельных случаях использование goto позволяет упростить код. По-видимому, сторонники goto не смогли оказать достаточного влияния на разработчиков, чтобы добавить новое ключевое слово. Похожие обсуждения в англиской версии: Why is there no Constant feature in Java? Is there a goto statement in Java?

Ответ 2



goto считается "плохим оператором", ухудшает читаемость и увеличивает запутанность кода, порождает трудноподдерживаемый "спагетти-код" (также нарушает очень важные концепции программирования, можно ознакомиться по ссылке в конце ответа). Некоторые серьезные люди считают, что ему нет места в языках программирования, и пишут об этом целые книги. Так вот, пока кто-то говорит об этом, создатели Java - делают. Они искренне считают, что без безусловного перехода мир станет чуточку добрее, и по совокупности проблем и преимуществ с ними можно согласиться. Подробнее Само же слово было зарезервировано на этапе создания языка, перекочевав из других популярных в то время. Так и болтается до сих пор... PS: в Java все же есть безусловные переходы, реализуемые через операторы break и continue с метками. Как часто вы ими пользовались и знали ли об этой возможности вообще (это по поводу нужности этого оператора)?

Ответ 3



Например они могут не использовать, но быть в языке, как задел на будущее, что бы в последующих версиях можно было легко добавить этот оператор и не пересечься с названием переменных/объектов в уже написанном(Legacy) на старой версии языка коде. В JavaScript, вроде, такая же практика. Касательно const, который можно заменить public static final: Ничего не мншает разработчикам JAVA в будущем реализовать const и добавить так называемых "синтаксический сахар", когда можно делать и так и так, и в итоге программа будет одинаково выполняться. Например, в C# много синтаксического сахара: Можно объявлять переменные по алиасу(int) или по самому типу(Int32) Есть LINQ, который позволяет в простых случаях обходится без циклов и т д...

Комментариев нет:

Отправить комментарий