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

287
20 мая 2017, 17:37

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

Answer 1

Многа букав: const и goto перешли из C++. Ключевым словам не нашли применения в Java. Функции, которые они выполняют в C++, в Java реализованы по-другому.

История

Исторически синтаксис Java основан на C++, поэтому разработчики приняли решение зарезервировать ряд ключевых слов C++, чтобы:

  • использовать их в дальнейшем при расширении языка;
  • упростить переход на Java для C++-разработчиков.

Таким образом вопрос сводиться к следующему: «Есть ли в 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?
Answer 2

goto считается "плохим оператором", ухудшает читаемость и увеличивает запутанность кода, порождает трудноподдерживаемый "спагетти-код" (также нарушает очень важные концепции программирования, можно ознакомиться по ссылке в конце ответа).

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

Само же слово было зарезервировано на этапе создания языка, перекочевав из других популярных в то время. Так и болтается до сих пор...

PS: в Java все же есть безусловные переходы, реализуемые через операторы break и continue с метками. Как часто вы ими пользовались и знали ли об этой возможности вообще (это по поводу нужности этого оператора)?

Answer 3

Например они могут не использовать, но быть в языке, как задел на будущее, что бы в последующих версиях можно было легко добавить этот оператор и не пересечься с названием переменных/объектов в уже написанном(Legacy) на старой версии языка коде.

В JavaScript, вроде, такая же практика.

Касательно const, который можно заменить public static final:

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

Например, в C# много синтаксического сахара:

  1. Можно объявлять переменные по алиасу(int) или по самому типу(Int32)
  2. Есть LINQ, который позволяет в простых случаях обходится без циклов и т д...
READ ALSO
Векторные иконки в версиях ниже 5-ой

Векторные иконки в версиях ниже 5-ой

Использую в своём приложении векторные кнопки(social) но они используются от 5-ой версии и выше, и вот незадача, моё приложение использует устройства...

202
Как сделать, чтобы после запятой шла одна цифра?

Как сделать, чтобы после запятой шла одна цифра?

Есть метод, который возвращает тип double, к примеру 313141 и тд

231
Как создать float из четырех байтов?

Как создать float из четырех байтов?

У меня есть обработчик, где поступают 4 байта и они превращаются в int, но эта схема не работает с float, потому что нет по битового сдвигаПомогите...

303
Android программно скрыть диалог при подключении usb устройства (как в ES Explorer)

Android программно скрыть диалог при подключении usb устройства (как в ES Explorer)

увидел такую возможность в es проводнике settings/display/usb plug-in message

219