Я пытался определить причину позади констант в Java, я узнал, что Java позволяет нам объявлять константы при помощи final
ключевое слово.
Мой вопрос состоит в том, почему Java не представлял Константу (const
) функция. Так как многие люди говорят, что это прибыло из C++, в C++ мы имеем const
ключевое слово.
Совместно используйте свои мысли.
Каждый раз, когда я перехожу от тяжелого кодинга на C++ к Java, мне требуется некоторое время, чтобы адаптироваться к отсутствию const-корректности в Java. Использование const
в C++ значительно отличается от простого объявления постоянных переменных, если вы не знали. По сути, оно гарантирует неизменяемость объекта при доступе к нему через специальный вид указателя, называемый const-указателем. В Java в местах, где я обычно хотел бы вернуть const-указатель, я вместо этого возвращаю ссылку с типом интерфейса, содержащим только методы, которые не должны иметь побочных эффектов. К сожалению, это не обеспечивается языком.
Википедия предлагает следующую информацию по этому вопросу:
Интересно, что спецификация языка Java рассматривает const как зарезервированное ключевое слово - т.е. такое, которое нельзя использовать в качестве идентификатора переменной - но не придает ему никакой семантики. Считается, что резервирование ключевого слова произошло для того, чтобы позволить расширить язык Java и включить в него методы const в стиле C++ и указатели на тип const. Тикет запроса на улучшение в Java Community Process для реализации const-корректности в Java был закрыт в 2005 году, что означает, что const-корректность, вероятно, никогда не попадет в официальную спецификацию Java.
Семантика C ++ const
сильно отличается от Java финал
. Если бы разработчики использовали const
, это было бы излишне запутанным.
Тот факт, что const
является зарезервированным словом, предполагает, что у разработчиков были идеи по реализации const
, но с тех пор они отказались от этого; см. этот закрытый баг . Указанные причины включают то, что добавление поддержки стиля C ++ const
вызовет проблемы совместимости.
Константы могут быть определены двумя способами - const
и static final
с точно такой же семантикой. Кроме того, static final
описывает поведение лучше, чем const
Что означает const
Во-первых, поймите, что семантика " Ключевое слово const "означает разные вещи для разных людей:
final
- ссылочную переменную нельзя переназначить так, чтобы она указывала на другой экземпляр (место в памяти), но экземпляр сам по себе является изменяемым const
- означает, что эта ссылка не может использоваться для изменения экземпляра (например,не может назначать переменные экземпляра, не может вызывать изменяемые методы) - влияет только на ссылочную переменную, поэтому неконстантная ссылка, указывающая на тот же экземпляр, может изменить экземпляр Почему или почему Не const
Во-вторых, если вы действительно хотите вникнуть в некоторые аргументы «за» и «против», см. Обсуждение в рамках этого запроса на улучшение (RFE) «ошибка». Этот RFE запрашивает функцию "ссылка только для чтения" типа "const". Тема "const", открытая в 1999 г., а затем закрытая / отклоненная Sun в 2005 г., активно обсуждалась:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Пока есть множество хороших аргументов с обеих сторон, некоторые из часто цитируемых (но не обязательно убедительных или четких) доводов против const
включают:
const
означает выше) Прежде чем кто-либо попытается обсудить со мной хорошие или плохие причины, обратите внимание, что это не мои причины .Это просто «суть» некоторых причин, которые я почерпнул из беглого обзора обсуждения РСЕ. Я не обязательно согласен с ними сам - я просто пытаюсь процитировать, почему некоторые люди (не я) могут посчитать ключевое слово const
не очень хорошей идеей. Лично мне хотелось бы, чтобы в язык было однозначно введено больше "константной" семантики.
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
просто означает, что ваш код не может изменить его без приведения, а не то, что значение является постоянным.