Похоже, что в этой точке ортодоксальность Java никогда не должна использовать открытые поля для состояния объекта. (Я не обязательно согласен, но это не относится к моему вопросу.) Учитывая это, было бы правильно сказать, что с того места, где мы находимся сегодня, ясно, что открытые поля Java были ошибкой / недостатком языкового дизайна? Или есть рациональный аргумент, что они являются полезной и важной частью языка, даже сегодня?
Благодарность!
Обновление: я знаю о более элегантных подходах, таких как C #, Python, Groovy и т. Д. Я не ищу эти примеры напрямую. Мне действительно просто интересно, есть ли еще кто-то в глубине бункера, бормочущий о том, как прекрасны общественные поля на самом деле, и как все массы - просто овцы и т. Д.
Обновление 2. Очевидно, что статические открытые открытые поля являются стандартным способом создания открытых констант. Я имел в виду больше использования открытых полей для состояния объекта (даже неизменяемого состояния). Я думаю, что это кажется недостатком дизайна, что нужно использовать открытые поля для констант, но не для состояния ... правила языка должны соблюдаться естественным образом, с помощью синтаксиса, а не руководящих принципов.
Ответы:
Они мне нравятся до тех пор, пока поле является окончательным и используется только внутри приложения, а не раскрывается в API для других приложений. Это делает ваш код короче и более читабельным.
Вы не должны выставлять открытые поля в API, потому что, выставляя открытые поля, вы также открываете реализацию. Если
getXXX()
вместо этого вы представите его как метод, вы можете изменить реализацию, не меняя интерфейс API. Например, вы можете изменить и получить значение от удаленного сервиса, но приложения, использующие API, не должны это знать.Это жизнеспособный дизайн для
public final
полей в неизменяемых классах.Из эффективной Java :
См. Также Почему я не должен использовать неизменяемые POJO вместо JavaBeans?
источник
getXXX()
вместо этого вы представите его как метод, вы можете изменить реализацию, не меняя интерфейс API. Например, вы можете изменить и получить значение от удаленного сервиса, но приложения, использующие API, не должны это знать.Использование пар методов get / set - трагический исторический недостаток дизайна. Я не могу думать о другом языке, который реализует свойства как многословно и неэффективно.
источник
Я думаю, что открытые поля подходят для класса, который по существу является типом значения, таким как комплексное число или точка, где класс делает немного больше, чем группирует примитивные типы вместе, как структура в стиле C, и, возможно, определяет несколько операторов.
источник
java.awt.Point
а друзья это немного кошмар.Point
в том, что неоднозначно, должна ли переменная типаPoint
инкапсулировать местоположения или инкапсулировать идентичность объекта с местоположением, которое может измениться. Концептуально, я бы посчитал код, который проходит вокруг,Point
очень похожим на код, который проходит вокруг массивов.Point
и изменим его, я должен ожидать, что объект, на который он ссылается, будет корректно обновляться на экране? Нет, проблема вPoint
том, что он изменчив. У нас былоString
/StringBuffer
но идея, похоже, не прошла. / Передача массивов имеет похожие проблемы.Определить публичные константы все еще полезно. Например
Тем не менее, по-прежнему предпочитайте enum где это возможно. Например
Для моделирования простых структурных классов это также полезно. Нет причин создавать геттер и сеттер для каждого поля, если они все равно являются публичными.
источник
До того, как IDE получили широкое распространение, обнародование всех ваших областей стало мощным инструментом для быстрого создания прототипов / проверок концепций.
В настоящее время существует очень мало оправданий для их использования, когда вы можете сгенерировать пару геттер / сеттер одним щелчком мыши.
источник
public final
полей более читабельно, чем 10getXXX()
методов.const
ключевого слова, если они не являются статичными, это серьезное нарушение инкапсуляции.Это субъективно, но мое мнение таково, что все публичное / частное понятие устарело и задом наперед.
В питоне нет публичного / приватного; в основном все публично. Не вызвало много проблем.
В Java вы, как правило, создаете бессмысленные методы получения / установки для каждого поля, чтобы избежать греха пометить их как «публичные». (ИМХО, если вы обнаружите, что делаете это, просто отметьте их как общедоступные).
источник