Почему у Java нет автоматических свойств, таких как C #? [закрыто]

C # имеет автоматические свойства, которые значительно упрощают ваш код:

public string Name { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }

В то время как Java заставляет вас писать такой большой код:

private String name;
private String middleName;
private String LastName;

public String Name(){
   return this.name;
}

etc..

Есть ли конкретная причина, по которой Java не реализовала нечто подобное ?

23
задан 3 revs, 3 users 100% 9 August 2010 в 15:08
поделиться

5 ответов

Не так просто добавить новые функции к существующему языку программирования, особенно если вы заботитесь об обратной совместимости. Sun всегда была чрезвычайно осторожна с добавлением новых функций в Java, потому что они хотели быть абсолютно уверены в том, что любая новая языковая функция не сломает миллионы программ Java, написанных за эти годы.

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

Были предложения добавить поддержку свойств в той или иной форме в Java, но похоже, что для Java 7 (следующая версия выходит) эта функция не рассматривается.

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

18
ответ дан 29 November 2019 в 01:51
поделиться

Ага, потому что его там нет. Как говорится, все функции начинаются нереализованными.

20
ответ дан 29 November 2019 в 01:51
поделиться

По той же причине C# 2.0 и ниже не имеет этого. Это скорее синтаксический сахар, чем особенность языка. Есть тонна подобных возможностей, которые можно было бы добавить в любой язык, но никто не знает, почему их нет в языке.

2
ответ дан 29 November 2019 в 01:51
поделиться

.net появился после Java, и одной из его целей было взаимодействие с COM. У COM были свойства, вероятно, как у VB, поэтому .net пришлось добавить их, чтобы сделать языки совместимыми. (К тому же, это была довольно красивая идея).

У Java не было такой необходимости, и ее создатели, вероятно, не хотели загрязнять значение "=" или делать вызовы функций похожими на переменные-члены. (Они - или, по крайней мере, были таковыми в какой-то момент - стремятся сохранить язык настолько чистым, насколько это возможно). Вместо этого они воспользовались спецификацией Java bean, которая определяет соглашение об именовании для геттеров и сеттеров. IDE, знающие спецификацию, могут более или менее подтасовать представление геттера и сеттера как одного "свойства" для целей проектирования.

1
ответ дан 29 November 2019 в 01:51
поделиться

Автоматические свойства строятся на свойствах.

Свойства в C# - это особенность языка, в Java - это соглашение (методы, начинающиеся с get или set, часто считаются свойствами людьми, говорящими о коде, но для компилятора они ничем не отличаются от foo или bar).

.NET и связанные с ним языки во многом основывались на COM (иногда следуя примеру, иногда намеренно не делая в COM то, что по тем или иным причинам было непопулярно).

COM имеет концепцию свойств, которая в VB была подкреплена особенностями языка (в C++ она была подкреплена соглашениями).

Ранние версии VB, особенно в контекстах, где он использовался для обеспечения базового программного доступа к объектным моделям, предоставленным из других источников, стремились упростить объектные модели, представленные пользователям, чтобы сделать различие между полем и методом, который получает или устанавливает (возможно, с дополнительной работой, возможно, нет) несущественным (учтите, что хотя они отличаются некоторым важным способом извне в .NET, синтаксически доступ к свойству и публичному полю одинаков). Когда VB и COM (а до этого OLE) росли, они росли вместе.

Итак, в целом, хотя C# разделяет наследование C/C++ с Java, у него также есть наследование, которое Java не разделяет, что сделало свойства хорошей идеей для создателей C#, но не для создателей Java.

Edit: At first I said:


Лично я думаю, что автоматические свойства - это обходной путь к недостатку свойств, а не способ упростить ваш код. Свойства "выглядят" как публичные поля синтаксически, но не являются ими полностью (попробуйте использовать DataBinder.Eval для получения поля). Если бы свойство было полностью публичным и не имело дополнительной функциональности в getter или setter (как в случае с автоматическими свойствами), я бы предпочел иметь просто публичное поле (инкапсуляция здесь не аргумент, так как полное публичное раскрытие все равно обходит это), но различия между полями и свойствами работают против этого.


Я отказываюсь от этого утверждения. Если сделать поля точно такими же, как свойства, то поля простых структур Plain-Old-Data должны будут действовать как свойства, что приведет к снижению производительности. Концептуально, я бы хотел, чтобы они были более похожи друг на друга, но всякий раз, когда я думаю об этом (а я не раз переходил от раздражения к "ой, подождите", как здесь), оказывается, что лучше так, как есть.

3
ответ дан 29 November 2019 в 01:51
поделиться