Государственная собственность VS Частная собственность с добытчиком? - PullRequest
6 голосов
/ 04 ноября 2011

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

Ответы [ 5 ]

7 голосов
/ 04 ноября 2011

Экспонирование полей напрямую считается плохой практикой.

Лучше держать поле закрытым и открывать только геттер и сеттер. Одним из преимуществ является то, что вы можете выбирать разные уровни доступа для метода получения и установки, тогда как поле имеет только один уровень доступа. Другое преимущество использования геттеров заключается в том, что они позволяют изменять реализацию без изменения интерфейса класса.

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

Относящиеся

4 голосов
/ 04 ноября 2011

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

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

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

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

1 голос
/ 04 ноября 2011

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

Единственное исключение из этого правила - для логических констант, для которых люди обычно предпочитают публичные статические конечные поля: например, Days.SATURDAY, а не days.getSaturday().Но если значение привязано к конкретному экземпляру, а не к классу, или может когда-либо измениться, или, как правило, не кажется, что должно быть универсальной константой, гибкость, обеспечиваемая частным полем / публичным геттером, делаетэто предпочтительнее.

0 голосов
/ 04 ноября 2011

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

public class BankAccountWithprivateField
{
    private Cash cash;

    // ...

    public void draw(int amount)
    {
        if(amount <= balance) cash.draw(amount);
        else sentMessage("Sorry your balance is less than what you request!");
    }
}

// ...

new BankAccountWithprivateField().draw(500);

Здесь вы не можете нарисовать больше, чем у вас на балансе.

public class BankAccountWithPublicField
{
    public Cash cash;

    // ...
}

// ...

new BankAccountWithPublicField().cash.draw(1000000);

Но здесь вы можете нарисовать 1 миллион долларов;)

0 голосов
/ 04 ноября 2011

Хранение поля private не позволяет другим классам изменять ваш объект, подумайте о модели наследования, где ребенок может манипулировать полями своего родителя.

...