Подтвердить что ты не робот

Почему метод getter и setter важен в java?

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

Я немного смущен этим. Может ли кто-нибудь дать правильные советы о том, почему мы используем геттер/сеттер и какие преимущества?

4b9b3361

Ответ 1

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

Поэтому не используйте этот шаблон бездумно. Внимательно рассмотрите, какие операции вам действительно нужны.

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

  • У вас может быть только геттер. Тогда свойство читается только. Это должно быть наиболее распространенным случаем.
  • У вас может быть только сеттер, что позволяет настраивать свойство, но сообщая, что ничто другое не должно зависеть от его значения.
  • Геттер может вычислять значение из нескольких полей, а не возвращать одно поле.
  • Геттер может сделать защитную копию.
  • Геттер может выполнять дорогостоящую операцию выборки лениво и использовать поле для кэширования значения
  • Сеттер может выполнять проверки работоспособности и бросать IllegalArgumentException
  • Сеттер может уведомлять слушателей об изменениях значения
  • У вас может быть сеттер, который объединяет несколько полей, потому что они принадлежат вместе концептуально. Это не соответствует спецификации JavaBeans, поэтому не делайте этого, если вы зависите от фреймворков или инструментов, ожидающих JavaBeans. В противном случае это полезный вариант.

Все это детали реализации, которые скрыты за простым интерфейсом "getter and setter". Это инкапсуляция.

Ответ 2

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

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

public class Measurement
{

    /**
     * The distance in centimeters.
     */
    private double distance;

    /**
     * Gets the distance in inches.
     * @return A distance value.
     */
    public double getDistance()
    {
        return distance / 2.54;
    }

    /**
     * Sets the distance.
     * @param distance The distance, in inches.
     */
    public void setDistance(double distance)
    {
        this.distance = distance * 2.54;
    }
}

Ответ 3

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

Ответ 4

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

Ответ 5

Здесь недостаток. Getters/Setters, как правило, раскрывают детали реализации вашего класса во внешнем мире. Это нехорошо. Представьте, что вы пишете пакет автомеханического программного обеспечения. Таким образом, вам понадобится класс Car, и поэтому вы будете раскрывать получатели и сеттеры для полей

Date lastOilChangeDate;
int lastOilChangeMileage;

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

Но что происходит, когда появляются новые автомобили, где вы определяете, требуется ли замена масла другим, чем "каждые 3000 миль или 3 месяца"? Возможно, у этих новых автомобилей есть датчик в масляной кастрюле, который измеряет загрязнение. Очевидно, вы хотите использовать это, чтобы определить, нужна ли замена масла.

Проблема заключалась в том, что вы решали неправильную проблему с этими getter/setters. Никто не хочет знать, когда была последняя замена масла, они хотят знать, нужен ли вам другой. Это были детали реализации, но вы сделали их частью интерфейса. То, что вы должны были сделать, было добавлено методом

public boolean needsOilChange() 

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

Ответ 6

это в основном используется в Java beans, как показано ниже.

public Class MyBean{

private int var1;

public void setVar1(int pVar1){

this.var1=pvar1;

}

public int getVar1(){

return var1; `

}

}

преимущества ниже

1. с этим мы можем достичь инкапсуляции

2. он называется шаблоном проектирования DTO (Data Transfer Object). он используется для передачи данных с одного уровня на другой в приложениях на основе MVC. например, u может получить введенные пользователем данные из формы (используя геттеры), и вы можете использовать одни и те же данные для вставки в базу данных (с помощью setter) и vice verca. последние фреймворки (SPring), обеспечивающие его как встроенную функциональность.