Почему не там никакая функция Constant в Java?

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

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

Совместно используйте свои мысли.

134
задан user207421 7 March 2016 в 02:53
поделиться

5 ответов

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

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

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

137
ответ дан 23 November 2019 в 23:56
поделиться

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

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

3
ответ дан 23 November 2019 в 23:56
поделиться

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

-2
ответ дан 23 November 2019 в 23:56
поделиться

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

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

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

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

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

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

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

81
ответ дан 23 November 2019 в 23:56
поделиться

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

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

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

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

например:

#include <iostream>

int main ()
{
    volatile const int x = 42;

    std::cout << x << std::endl;

    *const_cast<int*>(&x) = 7;

    std::cout << x << std::endl;

    return 0;
}

выводит 42, затем 7.

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

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

7
ответ дан 23 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: