Подтвердить что ты не робот

Почему была удалена константа из Java и С#?

Я знаю, что это обсуждалось много раз, но я не уверен, что действительно понимаю, почему разработчики Java и С# решили опустить эту функцию с этих языков. Меня не интересует, как я могу сделать обходные пути (используя интерфейсы, клонирование или любую другую альтернативу), а скорее в обосновании решения.

С точки зрения дизайна языка, почему эта функция была отклонена?

P.S: Я использую такие слова, как "пропущенные", которые некоторые люди могут найти неадекватными, поскольку С# был разработан в аддитивном (а не субтрактивном) подходе. Тем не менее, я использую такие слова, потому что функция существовала на С++ до того, как эти языки были разработаны, поэтому она опускается в смысле удаления из инструментария инструментария.

4b9b3361

Ответ 1

В это интервью, Андерс сказал:

Андерс Хейлсберг: Да. Что касается const, это интересно, потому что мы слушайте эту жалобу все время тоже: "Почему у тебя нет состязания?" неявный в вопросе: "Почему бы вам не имеют const, которые runtime?" Это действительно то, что люди спрашивают, хотя они не приходят и сказать так.

Причина, по которой const работает на С++, потому что вы можете отбросить его. если ты не мог отбросить его, тогда ваш мир сосать. Если вы объявите метод который принимает const Bla, вы можете пройти это неконстантная Бла. Но если это иначе вы не можете. если ты объявить метод, который принимает не-const Bla, вы не можете передать его const Bla. Так что теперь ты застрял. Так что вы постепенно требуется версия const все, что не const, и вы в конечном итоге с теневым миром. В С++ вы уйти с ним, потому что как с все на С++ это чисто необязательно хотите ли вы эту проверку или нет. Вы можете просто ударить сотню если вам это не нравится.

Ответ 2

Я предполагаю, прежде всего потому, что:

  • он не может быть принудительно применен даже в С++ (вы можете его набросить)
  • одна константа внизу может принудительно вызвать целую цепочку const в дереве вызовов

Оба могут быть проблематичными. Но особенно первое: если это не может быть гарантировано, какое использование? Возможные варианты:

  • неизменяемые типы (либо полная неизменность, либо неизменность эскиза)

Ответ 4

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

Даже если вы не хотите, чтобы объект был строго непреложным, если вы действительно хотели (что я бы не рекомендовал), вы могли бы установить на него какой-то режим блокировки, чтобы его можно было мутировать только при разблокировке, Использовать методы блокировки/разблокировки в качестве приватного или защищать по мере необходимости, и вы получаете некоторый уровень контроля доступа. В качестве альтернативы, если вы не собираетесь использовать этот метод как параметр для его изменения вообще, передать копию этого объекта или скопировать весь объект слишком тяжелый, а затем другой легкий объект данных, содержащий только необходимые Информация. Вы даже можете использовать динамические прокси для создания прокси-сервера для вашего объекта, который превращает любые вызовы в методы мутации в no-ops.

В принципе уже существует целая куча способов предотвращения мутации класса, что позволяет выбрать тот, который наиболее подходит для вашей ситуации (подсказка: выберите по возможности чистоту неизменности, поскольку она делает объект тривиально потокобезопасным и проще рассуждать в целом). Нет очевидной семантики для того, как можно было бы реализовать const, что было бы усовершенствованием этих методов, было бы еще одним делом узнать, что либо будет иметь гибкость, либо быть настолько гибким, чтобы быть бесполезным.

То есть, если я не пропустил что-то, что вполне возможно.: -)

Ответ 5

Java имеет собственную версию const; окончательный. Джошуа Блох описывает в своей Эффективная Java как эффективно использовать ключевое слово final. (btw, const - зарезервированное ключевое слово в Java, для будущих несоответствий)