Почему в 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;