Почему в Java нет постоянной функции?
Я пытался определить причину констант в Java
Я узнал, что Java позволяет нам объявлять константы с помощью final
ключевое слово.
мой вопрос в том, почему Java не ввела константу (const
функция). Поскольку многие говорят, что он пришел из C++, в C++ у нас есть const
ключевое слово.
пожалуйста, поделитесь своими мыслями.
8 ответов
каждый раз, когда я перехожу от тяжелого кодирования C++ к Java, мне требуется некоторое время, чтобы адаптироваться к отсутствию С const-корректность в Java. Это использование const
в C++ сильно отличается от простого объявления постоянных переменных, если вы не знали. По сути, это гарантирует, что объект неизменяем при доступе через специальный вид указателя, называемый const-указателем, когда в Java, в местах, где я обычно хочу вернуть const-указатель, я вместо этого возвращаю ссылку с тип интерфейса, содержащий только методы, которые не должны иметь побочных эффектов. К сожалению, это не обеспечивается langauge.
Википедия предлагает следующую информацию на тему:
интересно, что спецификация языка Java рассматривает const как зарезервированное ключевое слово, т. е. то, которое нельзя использовать в качестве идентификатора переменной, но не присваивает ему семантики. Считается, что бронирования сайта произошла для продления Язык Java для включения методов const в стиле C++и указателя на тип const. Билет запроса на улучшение в процессе сообщества Java для реализации корректности const в Java был закрыт в 2005 году, подразумевая, что корректность const, вероятно, никогда не найдет свой путь в официальную спецификацию Java.
Что значит const
mean
Во-первых, поймите, что семантика ключевого слова "const" означает разные вещи для разных людей:
-
ссылка только для чтения - Java
final
семантика-сама ссылочная переменная не может быть переназначена для указания на другой экземпляр (местоположение памяти), но сам экземпляр модифицируется -
только для чтения ссылка - C
const
указатель / ссылочная семантика-означает эта ссылка не может использоваться для изменения экземпляра (например, не может назначать переменные экземпляра, не может вызывать изменяемые методы) - влияет только на ссылочную переменную, поэтому неконстентная ссылка, указывающая на тот же экземпляр, может изменить экземпляр - неизменяемого объекта - означает, что сам экземпляр не может быть изменен-применяется к экземпляру, поэтому любая ссылка non-const не будет разрешена или не может быть использована для изменения экземпляра
- некоторые сочетание из вышеуказанное?
- другие?
почему const
Во-вторых, если вы действительно хотите копаться в некоторых аргументах "pro" vs "con", см. обсуждение в этом запросе на улучшение (RFE) "ошибка". Этот RFE запрашивает функцию"только для чтения "-типа" const". Открытая в 1999 году, а затем закрытая/отвергнутая Sun в 2005 году, тема "const" была энергично обсуждали:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
хотя есть много хороших аргументов с обеих сторон, некоторые из часто цитируемых (но не обязательно убедительных или четких) причин против const
включает:
- может иметь запутанную семантику, которая может быть неправильно использована и / или злоупотреблена (см. что значит
const
mean выше) - может дублировать возможности, в противном случае (например, проектирование неизменяемого класса с использованием неизменяемого интерфейса)
- может быть функция ползучести, что приводит к необходимости других семантических изменений, таких как поддержка передачи объектов по значению
прежде чем кто-либо попытается обсудить меня о том, являются ли это хорошими или плохими причинами, обратите внимание, что это не мои доводы. Они являются просто "сутью" некоторых причин, которые я почерпнул из беглого просмотра обсуждения RFE. Я не всегда с ними согласен. - Я просто пытаюсь привести, почему некоторые люди (не я) могут чувствовать 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
, поскольку создается псевдоним non-const,x
не является постоянным. Не каждый компилятор требует volatile
для этого поведения (хотя каждому компилятору разрешено встроить константу)
С более сложными системами вы получаете псевдонимы const/non-const без использования const_cast
, поэтому привыкание думать, что const означает что-то не меняется, становится все более и более опасным. const
просто означает, что ваш код не может изменить его без приведения, а не то, что значение является постоянным.
это немного старый вопрос, но я думал, что внесу свои 2 цента в любом случае, так как эта тема появилась в разговоре сегодня.
Это не совсем ответ почему нет const? но как чтобы сделать ваши занятия неизменными. (К сожалению, у меня еще недостаточно репутации, чтобы опубликовать комментарий к принятому ответу)
способ гарантировать неизменность объекта - это более тщательно спроектировать ваши классы, чтобы они были неизменяемыми. Это требует немного больше внимания, чем изменяемый класс.
это восходит к Джошу блоху Эффективная Java Пункт 15-Минимизировать Изменчивость. Если вы не читали книгу, возьмите копию и прочитайте ее несколько раз, я гарантирую, что это будет ваш образный "java игра".
В пункте 15 блох предлагает ограничить изменчивость классов для обеспечения состояния объекта.
процитировать книгу напрямую:
неизменяемый класс-это просто класс, экземпляры которого нельзя изменить. Вся информация, содержащаяся в каждом экземпляре, предоставляется при его создании и фиксируется на время существования объекта. Библиотеки платформы Java содержат множество неизменяемых классов, включая String, boxed primitive classes, BigInte - ger и BigDecimal. Для этого есть много веских причин: неизменяемые классы проще проектировать, реализовывать и использовать, чем изменяемые классы. Они менее подвержены ошибкам и более безопасной.
блох затем описывает, как сделать ваши классы неизменяемыми, следуя 5 простым правилам:
- не предоставляйте никаких методов, которые изменяют состояние объекта (т. е. setters, aka мутаторы)
- убедитесь, что класс не может быть расширен (это означает, объявив себя класс
final
). - сделать все поля
final
. - сделать все поля
private
. - обеспечить эксклюзивный доступ к любым изменяемым компонентам. (делая защитные копии объектов)
для получения более подробной информации я настоятельно рекомендую забрать копию книги.
семантика c++const
сильно отличаются от Java final
. Если бы конструкторы использовали const
Это было бы излишне запутанным.
тот факт, что const
Это зарезервированное слово предполагает, что у дизайнеров были идеи для реализации const
, но с тех пор они решили против этого; см. это закрытая ошибка. Заявленные причины включают, что добавление поддержки стиля C++const
вызовет проблемы совместимости.
существует способ создания переменных "const" в Java, но только для определенных классов. Просто определите класс с конечными свойствами и подкласс. Затем используйте базовый класс, где вы хотите использовать "const". Аналогично, если вам нужно использовать методы "const", добавьте их в базовый класс. Компилятор не позволит вам изменить то, что он считает конечными методами базового класса, но он будет читать и вызывать методы подкласса.
было бы два способа определить константы -const
и static final
, С точно такой же семантикой. Более того!--1--> описывает поведение лучше, чем const
Я слышал слух, что использование перечислений в Java плохо сказывается на производительности игры. Не знаю почему. 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
}