Почему в Java нет постоянной функции?



Я пытался определить причину констант в Java
Я узнал, что Java позволяет нам объявлять константы с помощью final ключевое слово.



мой вопрос в том, почему Java не ввел константу (const функция). Поскольку многие люди говорят, что он пришел из C++, в C++ у нас есть const ключевое слово.



пожалуйста, поделитесь своими мыслями.

497   8  

8 ответов:

каждый раз, когда я перехожу от тяжелого кодирования C++ к Java, мне требуется немного времени, чтобы адаптироваться к отсутствию С const-корректность в Java. Это использование const в C++ сильно отличается от простого объявления постоянных переменных, если вы не знали. По сути, это гарантирует, что объект является неизменяемым при доступе через специальный тип указателя, называемый const-указателем, когда в Java, в местах, где я обычно хочу вернуть const-указатель, я вместо этого возвращаю ссылку с помощью тип интерфейса, содержащий только методы, которые не должны иметь побочных эффектов. К сожалению, это не соблюдается языком.

Википедия предлагает следующую информацию на тему:

интересно, что спецификация языка Java рассматривает const как зарезервированное ключевое слово, т. е. такое, которое не может использоваться в качестве идентификатора переменной, но не присваивает ему семантики. Считается, что резервирование ключевого слова произошло, чтобы позволить расширение Язык Java для включения методов const в стиле C++и указателя на тип const. Билет запроса на улучшение в процессе сообщества Java для реализации корректности const в Java был закрыт в 2005 году, подразумевая, что корректность const, вероятно, никогда не найдет своего пути в официальную спецификацию Java.

Что значит const значит
Во-первых, поймите, что семантика ключевого слова "const" означает разные вещи для разных людей:

  • ссылка только для чтения - Java final семантика-сама ссылочная переменная не может быть переназначена для указания на другой экземпляр (расположение в памяти), но сам экземпляр может быть изменен
  • читается-только ссылка - C const указатель / ссылка семантика-означает эта ссылка не может использоваться для изменения экземпляра (например, не может назначать переменные экземпляра, не может вызывать изменяемые методы) - влияет только на переменную ссылки, поэтому неконстантная ссылка, указывающая на тот же экземпляр, может изменить экземпляр
  • неизменяемого объекта - означает, что сам экземпляр не может быть изменен-применяется к экземпляру, поэтому любая неконстантная ссылка не будет разрешена или не может быть использована для изменения экземпляра
  • некоторые сочетание вышеперечисленного?
  • другие?

почему const
Во-вторых, если вы действительно хотите копаться в некоторых аргументах "pro" и "con", см. обсуждение под этим запросом на улучшение (RFE) "ошибка". Этот RFE запрашивает функцию"только для чтения ссылки "типа " const". Открытая в 1999 году, а затем закрытая/отвергнутая Sun в 2005 году, тема "const" была энергично обсуждается:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

хотя есть много хороших аргументов с обеих сторон, некоторые из часто цитируемых (но не обязательно убедительных или четких) причин против const включает:

  • может иметь запутанную семантику, которая может быть неправильно использована и / или злоупотреблять (см. что значит const значит выше)
  • может дублировать возможности, в противном случае (например, проектирование неизменяемого класса с использованием неизменяемого интерфейса)
  • может быть функция ползучести, что приводит к необходимости других семантических изменений, таких как поддержка передачи объектов по значению

прежде чем кто-нибудь попытается спорить со мной о том, являются ли это хорошими или плохими причинами, обратите внимание, что это не мои доводы. Это просто "суть" некоторых причин, которые я почерпнул из беглого просмотра обсуждения 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, так как создается неконстантный псевдоним,x не является постоянным. Не каждый компилятор требует volatile для такого поведения (хотя каждый компилятор может встроить константу)

в более сложных системах вы получаете псевдонимы const/non-const без использования const_cast, так что привыкание думать, что const означает что-то не изменится, становится все более и более опасным. const просто означает, что ваш код не может изменить его без приведения, а не то, что значение является постоянным.

Это немного старый вопрос, но я думал, что внесу свои 2 цента в любом случае, так как эта тема появилась в разговоре сегодня.

Это точно не ответ почему нет const? но как чтобы сделать ваши занятия неизменными. (К сожалению, у меня еще недостаточно репутации, чтобы опубликовать комментарий к принятому ответу)

способ гарантировать неизменность объекта заключается в том, чтобы более тщательно проектировать свои классы, чтобы быть неизменными. Это требует немного больше внимания, чем изменяемый класс.

это восходит к Джошу блоху Эффективная JavaПункт 15-Минимизировать Изменчивость. Если вы еще не читали книгу, возьмите копию и прочитайте ее несколько раз я гарантирую, что это будет ваш образный "java game".

в п. 15 блох предлагает ограничить изменяемость классов для обеспечения состояния объекта.

процитировать книгу непосредственно:

неизменяемый класс-это просто класс, экземпляры которого не могут быть изменены. Вся информация, содержащаяся в каждом экземпляре, предоставляется при его создании и фиксируется на время существования объекта. Библиотеки платформы Java содержит множество неизменяемых классов, включая string, примитивных классов на упаковке, а BigInteger и bigdecimal. Для этого есть много веских причин: неизменяемые классы легче проектировать, реализовывать и использовать, чем изменяемые классы. Они менее подвержены ошибкам и более безопасной.

затем блох описывает, как сделать ваши классы неизменяемыми, следуя 5 простым правилам:

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

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

семантика C++const сильно отличаются от Java final. Если бы дизайнеры использовали const Это было бы излишне запутанным.

дело в том, что const это сдержанное слово говорит о том, что у дизайнеров были идеи для реализации const, но с тех пор они решили против этого; см. это закрытая ошибка. Указанные причины включают в себя, что добавление поддержки стиля C++const повлечет за собой проблемы с совместимостью.

существует способ создания переменных "const" в Java, но только для определенных классов. Просто определите класс с конечными свойствами и подкласс его. Затем используйте базовый класс, где вы хотели бы использовать "const". Аналогично, если вам нужно использовать методы "const", добавьте их в базовый класс. Компилятор не позволит вам изменить то, что он считает окончательными методами базового класса, но он будет читать и вызывать методы в подклассе.

было бы два способа определить константы -const и static final, С точно такой же семантикой. Кроме того static final описывает поведение лучше, чем 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
}

Comments

    Ничего не найдено.