Почему константность была удалена из Java и C #? - PullRequest
12 голосов
/ 27 января 2009

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

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

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

Ответы [ 5 ]

15 голосов
/ 27 января 2009

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

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

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

7 голосов
/ 27 января 2009

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

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

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

  • неизменяемые типы (либо полная неизменность, либо неизменность эскимо)
1 голос
/ 27 января 2009

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

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

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

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

1 голос
/ 27 января 2009

Относительно того, почему они это сделали, вовлеченные сказали так:

http://blogs.msdn.com/ericgu/archive/2004/04/22/118238.aspx http://blogs.msdn.com/slippman/archive/2004/01/22/61712.aspx также упоминается Раймонд Чен http://blogs.msdn.com/oldnewthing/archive/2004/04/27/121049.aspx

В многоязычной системе это было бы очень сложно.

0 голосов
/ 27 января 2009

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

...