Почему в Java нет постоянной функции?

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

Мой вопрос в том, почему Java не представила функцию Constant ( const ). Поскольку многие люди говорят, что это исходит из C ++, в C ++ у нас есть ключевое слово const .

Пожалуйста, поделитесь своими мыслями.

Каждый раз, когда я перехожу от тяжелой C ++-кодировки к Java, мне нужно немного времени, чтобы адаптироваться к отсутствию const-correctness в Java. Это использование const в C ++ сильно отличается от простого объявления постоянных переменных, если вы этого не знали. По сути, он гарантирует, что объект является неизменным при доступе через специальный вид указателя, называемый const-указателем. Когда в Java, в тех местах, где я обычно хочу возвращать const-указатель, вместо этого я возвращаю ссылку с типом интерфейса содержащие только методы, которые не должны иметь побочных эффектов. К сожалению, это не обеспечивается langauge.

Википедия предлагает следующую информацию по теме:

Интересно, что спецификация языка Java рассматривает const как зарезервированное ключевое слово, то есть одно, которое нельзя использовать как идентификатор переменной, но не присваивает ему семантики. Считается, что резервирование ключевого слова произошло, чтобы позволить расширению языка Java включать методы const и C ++ в тип const. Билет запроса на повышение в процессе Java Community Process для реализации корректности const в Java был закрыт в 2005 году, подразумевая, что корректность констант, вероятно, никогда не найдет своего пути в официальную спецификацию Java.

Что означает const
Во-первых, осознайте, что семантика ключевого слова «const» означает разные вещи для разных людей:

  • ссылка только для чтенияfinal семантика Java – сама ссылочная переменная не может быть переназначена для указания на другой экземпляр (ячейка памяти), но сам экземпляр модифицируется
  • read-only reference – C const pointer / reference semantics – означает, что эта ссылка не может использоваться для изменения экземпляра (например, не может назначать переменные экземпляра, не может вызывать изменяемые методы) – влияет только на ссылочную переменную, поэтому неконстантная ссылка, указывающая на тот же экземпляр может изменить экземпляр
  • неизменяемый объект – означает, что сам экземпляр не может быть изменен – ​​применяется к экземпляру, поэтому любая неконстантная ссылка не будет разрешена или не может использоваться для изменения экземпляра
  • некоторая комбинация из вышеперечисленного ?
  • другие ?

Почему или почему не const
Во-вторых, если вы действительно хотите вникнуть в некоторые аргументы «pro» и «con», см. Обсуждение по этому запросу для улучшения (RFE) «ошибка». Эта RFE запрашивает функцию «constable» типа «только для чтения». Открытая в 1999 году, а затем закрытая / отвергнутая Sun в 2005 году, тема «const» была решительно обсуждена:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

Хотя есть много хороших аргументов с обеих сторон, некоторые из часто цитируемых (но не обязательно убедительных или четких) аргументов против const include:

  • могут иметь запутанную семантику, которая может быть неправильно использована и / или злоупотребляться (см. раздел « Что означает значение const )
  • может дублировать возможность, доступную иным образом (например, проектирование неизменяемого classа с использованием неизменяемого интерфейса)
  • может быть признаком ползучести, что приводит к необходимости в других семантических изменениях, таких как поддержка передачи объектов по значению

Прежде чем кто-нибудь попытается обсудить меня, являются ли это хорошими или плохими причинами, обратите внимание, что это не мои причины . Это просто «сущность» некоторых причин, по которым я почерпнул из-за сглаживания дискуссии на радиопомех. Я не обязательно соглашаюсь с ними сам – я просто пытаюсь указать, почему некоторые люди (а не я) могут чувствовать ключевое слово const возможно, не очень хорошая идея. Лично мне хотелось бы, чтобы более семантика «const» была введена на язык недвусмысленным образом.

const в C ++ не означает, что значение является константой.

const в C ++ подразумевает, что клиент контракта обязуется не изменять его стоимость.

Изменяется ли значение выражения const становится более очевидным, если вы находитесь в среде, которая поддерживает параллелизм на основе streamов.

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

например:

 #include  int main () { volatile const int x = 42; std::cout << x << std::endl; *const_cast(&x) = 7; std::cout << x << std::endl; return 0; } 

выходы 42, то 7.

Хотя x помеченный как const , в качестве не-const-псевдонима создается, x не является константой. Не каждый компилятор требует volatile для этого поведения (хотя каждому компилятору разрешено встроить константу)

С более сложными системами вы получаете const / non-const aliases без использования const_cast , поэтому привычка думать, что const означает, что что-то не изменится, становится все более опасной. const просто означает, что ваш код не может изменить его без броска, а не то, что значение является постоянным.

Это немного старый вопрос, но я думал, что внесет свои 2 цента в любом случае, так как эта тема появилась сегодня в разговоре.

Это точно не отвечает, почему нет const? но как сделать ваши classы неизменными. (К сожалению, у меня еще недостаточно репутации, чтобы опубликовать комментарий к принятому ответу)

Способ гарантировать неизменность объекта – это более тщательно разрабатывать ваши classы, чтобы быть неизменными. Это требует немного большей осторожности, чем изменчивый class.

Это восходит к Эффективному Java- эффекту Джоша Блоха. 15 – Минимизировать Мутируемость . Если вы еще не читали книгу, возьмите копию и прочитайте ее несколько раз, я гарантирую, что это приведет к вашей образной «java-игре» .

В пункте 15 Блоха предполагается, что вы должны ограничить изменчивость classов для обеспечения состояния объекта.

Процитировать книгу напрямую:

Неизменяемый class – это просто class, экземпляры которого не могут быть изменены. Вся информация, содержащаяся в каждом экземпляре, предоставляется при ее создании и фиксируется для времени жизни объекта. Библиотеки платформы Java содержат множество неизменяемых classов, включая String, classы в штучной упаковке и BigInteger и BigDecimal. Для этого есть много веских причин: неизменяемые classы легче разрабатывать, реализовывать и использовать, чем изменяемые classы. Они менее подвержены ошибкам и более безопасны.

Затем Блох описывает, как сделать ваши classы неизменными, следуя 5 простым правилам:

  1. Не предоставляйте какие-либо методы, которые изменяют состояние объекта (т. Е. Сеттеры, aka mutators )
  2. Убедитесь, что class не может быть расширен (это означает объявление classа как final ).
  3. Сделайте все поля final .
  4. Сделать все поля private .
  5. Обеспечьте эксклюзивный доступ к любым изменяемым компонентам. (путем создания защитных копий объектов)

Для более подробной информации я настоятельно рекомендую собрать копию книги.

Семантика C ++ const сильно отличается от Java final . Если бы дизайнеры использовали const это было бы излишне запутанным.

Тот факт, что const является зарезервированным словом, предполагает, что у дизайнеров были идеи для реализации const , но с тех пор они отказались от него; см. эту закрытую ошибку . Заявленные причины include в себя то, что добавление поддержки стиля C ++ style вызовет проблемы совместимости.

Существует способ создания переменных «const» в Java, но только для определенных classов. Просто определите class с конечными свойствами и подclassом. Затем используйте базовый class, где вы хотите использовать «const». Аналогично, если вам нужно использовать методы «const», добавьте их в базовый class. Компилятор не позволит вам изменить то, что, по его мнению, является последним методом базового classа, но будет читать и вызывать методы в подclassе.

Было бы два способа определить константы – const и static final , с той же семантикой. Более того, static final описывает поведение лучше, чем const

Я слышал слухи, что использование Enums в Java плохо для производительности игры. Я не знаю, почему. Const будет работать лучше …

примеры реальной жизни CONST используют в Java … просто закодируйте это так … и тогда ваши операторы switch будут работать, не жалуясь.

 protected static final int cOTHER = 0; protected static final int cRPM = 1; protected static final int cSPEED = 2; protected static final int cTPS = 3; protected int DataItemEnum = 0; public static final int INVALID_PIN = -1; public static final int LED_PIN = 0; 

,

 switch (this.DataItemEnum) { case cRPM: percent = (Value - 0.001*Min)/(Max - Min); break; default: percent = (Value - Min)/(Max - Min); break } 
Давайте будем гением компьютера.