2009-01-27 3 views
12

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

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

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

+0

Почему этот вопрос был остановлен, интересно? –

+0

может спровоцировать субъективное/аргументативное обсуждение, хотя формулировка вопроса в изумлении задает вопрос «почему дизайнеры выбрали», а не почему это было хорошим/плохим. – ShuggyCoUk

ответ

15

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

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

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

+6

Скорее всего, это ошибка, поскольку он знает лучше. Если вы правильно объявляете foo (Bla &), это по какой-то причине: оно изменяет Bla. Вы не добавляете foo (Bla const &), так как он не может работать. Если foo случайно объявлен (Bla &), но он не модифицирует Bla, вы можете смело добавить только константу. Не требуется перегрузка. – MSalters

+0

Отсутствие const-ref является IMHO одной из самых больших недостатков дизайна в .NET. Я соглашусь с г-номХейльсберг считает, что проектирование для const-correctness затруднено, но правильность семантической константы часто необходима для правильной работы программ, независимо от того, обеспечивает ли она ее каркас, а const-correctness намного легче достичь, если она разработана снизу вверх, если кто-то должен выманить его позже. – supercat

7

Я думаю, в первую очередь потому, что:

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

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

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

если вы не можете гарантировать его в каком-либо месте, то это место должно быть инкапсулировано. альтернативно, если документация обещает не настраивать какие-либо вводные данные и, в действительности, нет, то это допустимый прецедент использования const_cast, то есть для взаимодействия с const-неправильным кодом. Как и в случае с hardhats, они обеспечивают ограничения, а также защиту. –

1

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

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

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

1

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

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

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

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

+1

Можно сказать, что «const» превращает изменяемый объект в неизменяемый без дополнительного кода. С неизменяемыми типами вы часто получаете второй тип «строитель». - Вообще мне нравится декларативная выразительность «const»; хотя я согласен, что это банда червей. – peterchen

0

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

+0

Финал значительно отличается от const, это всего лишь тень. readonly in C# эквивалентен final в java, за исключением того, что он не может быть применен к локальным переменным (позор IMO). const также является зарезервированным словом в C# по той же причине – ShuggyCoUk

Смежные вопросы