Почему в Java нет постоянной функции?
Я пытался определить причину постоянных в Java
Я узнал, что Java позволяет нам объявлять константы с помощью ключевого слова final
.
Мой вопрос в том, почему Java не представила функцию Constant (const
). Поскольку многие люди говорят, что он пришел из С++, в С++ у нас есть ключевое слово const
.
Поделитесь своими мыслями.
Ответы
Ответ 1
Каждый раз, когда я перехожу от тяжелой С++-кодировки к Java, мне нужно немного времени, чтобы адаптироваться к отсутствию const-correctness в Java, Это использование const
в С++ сильно отличается от простого объявления постоянных переменных, если вы этого не знали. По сути, он гарантирует, что объект является неизменным при доступе через специальный вид указателя, называемый const-указателем. Когда в Java, в тех местах, где я обычно хочу возвращать const-указатель, вместо этого я возвращаю ссылку с типом интерфейса содержащие только методы, которые не должны иметь побочных эффектов. К сожалению, это не обеспечивается langauge.
Википедия предлагает следующую информацию по теме:
Интересно, что спецификация языка Java рассматривает const как зарезервированное ключевое слово - то есть одно, которое нельзя использовать как идентификатор переменной, - но не присваивает ему семантики. Считается, что резервирование ключевого слова произошло, чтобы позволить расширению языка Java включать методы const и С++ в тип const. Билет запроса на повышение в процессе Java Community Process для реализации корректности const в Java был закрыт в 2005 году, подразумевая, что корректность const вряд ли найдет свой путь в официальной спецификации Java.
Ответ 2
Что означает const
Во-первых, осознайте, что семантика ключевого слова "const" означает разные вещи для разных людей:
- ссылка только для чтения - семантика Java
final
- сама ссылочная переменная не может быть переназначена для указания на другой экземпляр (ячейка памяти), но сам экземпляр модифицируется
- ссылка только для чтения - C
const
указатель/ссылочная семантика - означает, что эта ссылка не может использоваться для изменения экземпляра (например, не может назначать переменные экземпляра, не может вызывать изменяемые методы) - влияет только на ссылочную переменную, -const ссылка на один и тот же экземпляр может изменить экземпляр
- неизменяемый объект - означает, что сам экземпляр не может быть изменен - применяется к экземпляру, поэтому любая неконстантная ссылка не будет разрешена или не может использоваться для изменения экземпляра
- некоторая комбинация из вышеперечисленного?
- другие?
Почему или почему не const
Во-вторых, если вы действительно хотите вникнуть в некоторые аргументы "pro" и "con", см. Обсуждение по этому запросу для улучшения (RFE) "ошибка". Эта RFE запрашивает функцию "constable" типа "только для чтения". Открытая в 1999 году, а затем закрытая/отвергнутая Sun в 2005 году, тема "const" была решительно обсуждена:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Несмотря на то, что с обеих сторон есть много хороших аргументов, некоторые из часто цитируемых (но не обязательно убедительных или четких) аргументов против const
включают:
- может иметь путаницу в семантике, которая может быть использована неправильно и/или злоупотреблять (см. раздел "Что означает
const
выше" ).
- может дублировать возможность в других случаях (например, проектирование неизменяемого класса с использованием неизменяемого интерфейса).
- может быть функцией ползучести, что приводит к необходимости в других семантических изменениях, таких как поддержка передачи объектов по значению
Прежде чем кто-нибудь попытается обсудить меня, являются ли это хорошими или плохими причинами, обратите внимание, что это не мои причины. Это просто "сущность" некоторых причин, по которым я почерпнул из-за сглаживания дискуссии на радиопомех. Я не обязательно соглашаюсь с ними сам - я просто пытаюсь назвать, почему некоторые люди (а не я) могут чувствовать ключевое слово const
, возможно, не очень хорошая идея. Лично мне хотелось бы, чтобы более семантика "const" была введена на язык недвусмысленным образом.
Ответ 3
Константа не используется, потому что вы не можете обеспечить тот факт, что значение является постоянным в Java. Поэтому это было бы неправильным. Финал - возможно (хотя и субъективно) - лучшее имя, поскольку оно указывает, что переменная является окончательной ссылкой (ее нельзя переназначить).
Как и в стороне, const является зарезервированным, но неиспользуемым ключевым словом в Java.
Ответ 4
const
в С++ не означает, что значение является константой.
const
в С++ подразумевает, что клиент контракта обязуется не изменять его значение.
Изменяется ли значение выражения < <20 > , если вы находитесь в среде, поддерживающей поток на основе concurrency.
Поскольку Java была разработана с самого начала для поддержки потока и блокировки concurrency, она не добавила путаницы, перегружая этот термин, чтобы иметь семантику, которая имеет 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 aliases без использования const_cast
, поэтому привычка думать, что const означает, что что-то не изменится, становится все более опасной. const
просто означает, что ваш код не может изменить его без броска, а не то, что значение является постоянным.
Ответ 5
Это немного старый вопрос, но я думал, что внесет свои 2 цента в любом случае, так как сегодня эта тема появилась в разговоре.
Это точно не отвечает, почему нет const? но как сделать ваши классы неизменными. (К сожалению, у меня еще недостаточно репутации, чтобы опубликовать комментарий к принятому ответу)
Способ гарантировать неизменность объекта - это более тщательно разрабатывать ваши классы, чтобы быть неизменными. Это требует немного большей осторожности, чем изменчивый класс.
Это относится к Джошу Блоху Эффективная Java Пункт 15 - Минимизировать Mutability. Если вы еще не читали книгу, возьмите копию и прочитайте ее несколько раз, я гарантирую, что это приведет к вашей образной "java-игре".
В пункте 15 Блоха предлагается ограничить изменчивость классов для обеспечения состояния объекта.
Процитировать книгу напрямую:
Неизменяемый класс - это просто класс, экземпляры которого не могут быть изменены. Вся информация, содержащаяся в каждом экземпляре, предоставляется при ее создании и фиксируется для времени жизни объекта. Библиотеки платформы Java содержат множество неизменяемых классов, включая String, классы в штучной упаковке и BigInteger и BigDecimal. Для этого есть много веских причин: неизменяемые классы легче разрабатывать, реализовывать и использовать, чем изменяемые классы. Они менее подвержены ошибкам и более безопасны.
Затем Блох описывает, как сделать ваши классы неизменными, следуя 5 простым правилам:
- Не предоставляйте какие-либо методы, которые изменяют состояние объектов (т.е. сеттеры, ака мутаторы).
- Убедитесь, что класс can not расширен (это означает объявление класса как
final
).
- Сделать все поля
final
.
- Сделать все поля
private
.
- Обеспечьте эксклюзивный доступ к любым изменяемым компонентам. (путем создания защитных копий объектов)
Для более подробной информации я настоятельно рекомендую собрать копию книги.
Ответ 6
Семантика С++ const
сильно отличается от Java final
. Если бы дизайнеры использовали const
, это было бы излишне запутывающим.
Тот факт, что const
является зарезервированным словом, предполагает, что у дизайнеров были идеи для реализации const
, но с тех пор они отказались от него; см. эту закрытую ошибку. Указанные причины включают в себя то, что добавление поддержки стиля С++ const
вызовет проблемы совместимости.
Ответ 7
Существует способ создания переменных "const" в Java, но только для определенных классов. Просто определите класс с конечными свойствами и подклассом. Затем используйте базовый класс, где вы хотите использовать "const" . Аналогично, если вам нужно использовать методы "const" , добавьте их в базовый класс. Компилятор не позволит вам изменить то, что, по его мнению, является последним методом базового класса, но будет читать и вызывать методы в подклассе.
Ответ 8
Было бы два способа определить константы - const
и static final
с той же семантикой. Более того, static final
описывает поведение лучше, чем const
Ответ 9
Вы можете использовать static final для создания чего-то, что работает аналогично Const, я использовал это в прошлом.
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;