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