Почему в 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 простым правилам:

  1. не предоставляйте никаких методов, которые изменяют состояние объекта (т. е. setters, aka мутаторы)
  2. убедитесь, что класс не может быть расширен (это означает, объявив себя класс final).
  3. сделать все поля final.
  4. сделать все поля private.
  5. обеспечить эксклюзивный доступ к любым изменяемым компонентам. (делая защитные копии объектов)

для получения более подробной информации я настоятельно рекомендую забрать копию книги.


семантика 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
}