Являются ли «защищенные» и «публичные» видимости бесполезными для полей классов? - PullRequest
5 голосов
/ 28 марта 2012

Рекомендуется для инкапсуляции использовать private поля с аксессорами (получателями и установщиками) вместо protected и public полей.

Итак, следуя этой лучшей практике, мы больше никогда не используем protected и public. Они стали бесполезными, или каковы их варианты использования?

Единственное, о чем я могу думать, это об открытых static final атрибутах (то есть константах класса).

Примечание: по крайней мере, так обстоит дело в мире Java, но вопрос касается всех языков.

Ответы [ 7 ]

3 голосов
/ 28 марта 2012

с точки зрения внутренних полей? Да, они бесполезны во многих случаях. (Иногда protected приемлемо, если вы ожидаете, что будут подклассы, хотя.) И атрибуты public static final также вполне приемлемы.

Тем не менее, public и protected методы абсолютно необходимы.

2 голосов
/ 28 марта 2012

Лучшие практики могут меняться со временем.
Я могу подумать в двух случаях использования открытых полей, оба как-то противоречивы.
Адам Бьен говорит в этом посте , что если вы используете DTOВы не можете использовать private + getter + setter, а только открытые поля.Таким образом, вы уверены, что данные транспортируются как есть, без каких-либо изменений.Но в той же строке он добавляет, что это будет стоить вам много собраний, объясняющих, почему вы делаете это таким образом ...

Еще одно использование непостоянных открытых полей - использование открытых полей final (инициализированных в конструкторе) для обеспечениянеизменность.Создание таких классов, как

public Person{
    public final String lastName;
    public final String firstName;
    public Person(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

, является своего рода новой лучшей практикой , рекомендованной в таких местах, как codemonkeyism .

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

1 голос
/ 28 марта 2012

В технике «наилучшая практика» означает общие рекомендации.Использование методов получения и установки не является лучшим во всех случаях.Например, если вы создаете BST, тогда намного проще объявить поля класса Node public (то есть data, left, right);тогда методы в BST проще для чтения и записи.Опять же, поскольку прямой доступ в некоторых случаях намного проще, вы можете использовать защищенный, чтобы предоставить прямой доступ к подклассам, при этом отказывая в доступе общественности.

1 голос
/ 28 марта 2012

«Бесполезно» в глазах смотрящего.Некоторые «лучшие практики» переоценены:

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

Предположим, вам нужен доступ к значению, которое никогда не изменяется (например, длина массива) a public final Поле идеально подходит для этого.Кроме того, очень распространено иметь класс «Константы», который содержит только поля public static final.Существует бесчисленное множество стандартных библиотечных классов с полями public static final.На самом деле, почти каждый раз, когда вам нужна публичная константа, это то, что нужно использовать.

protected поля довольно редки, AFAIK.Вы действительно должны иметь подкласс, чтобы иметь предвидение и необходимость использовать protected.

0 голосов
/ 28 марта 2012

public, private, protected и package не ограничены полями.

Есть много полезных приложений, которые будут использоваться в методах и конструкторах.

Однако попытка будет непоследовательнаограничить поля только частной областью, поскольку java не может сделать это в случае вложенных / внутренних классов.

0 голосов
/ 28 марта 2012

Иногда существуют внутренние константы, которые позволяют использовать только подкласс, тогда вам может понадобиться модификатор protected вместо создания геттера для этих констант. Это применимо к полям, которые допускают прямой доступ к подклассу, который не доступен снаружи.

0 голосов
/ 28 марта 2012

Ну, я все еще вижу много полей public static final, которые имеют смысл для меня - поскольку они являются константами.Помимо этого (и некоторых случаев protected - но всегда нужно быть осторожными), я думаю, что это очень редко можно увидеть (и у вас должны быть веские причины, о которых я не могу думать, для создания поля public, а неfinal по крайней мере).

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

...