Какие имена должны иметь методы getter и setter - PullRequest
4 голосов
/ 27 августа 2011

Я все еще очень озадачен методами получения и установки. У меня был этот код;

public class MethodsInstances {

    public MethodsInstances(String name){
        girlName = name;
    }

    private String girlName;

    public String getName(){
        return girlName;
    }

    public void sayName(){
        System.out.printf("Your first gf was %s", getName());

    }
}

Но для "sayName", почему бы вам не использовать getName (), просто наберите girlName? Это было бы так же, потому что getName () возвращает girlName, как видно из кода. Кроме того, методы должны начинаться с get и set, или их можно называть как угодно?

Огромное спасибо новичку Dan B

Ответы [ 7 ]

4 голосов
/ 27 августа 2011

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

Представьте, что вы используете girlName вместо его геттера. Затем, если вы хотите добавить что-то похожее на значение по умолчанию (скажем, имя по умолчанию - «Гость», если оно не было установлено ранее), вам придется изменить как метод получения, так и функцию sayName.

Нет необходимости для getter и setter начинать с get и set - они являются просто обычными функциями-членами. Однако это соглашение принято. (особенно если вы используете Java Beans )

3 голосов
/ 27 августа 2011

Вы можете использовать переменную непосредственно в своем примере, в основном потому, что sayName() находится в том же классе.

Кроме этого, я вижу 3 причины наличия геттеров и сеттеров:

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

2.) Классы с геттерами и сеттерами часто следуют шаблону проектирования Java-бинов. Этот шаблон позволяет использовать эти объекты в шаблонизаторах или языках выражения, таких как JSP или Spring.

3.) В некоторых случаях это предотвращает фактические ошибки. Пример:

public class DateHolder() {
    public Date date;

    public static void main(String... args) {
        DateHolder holder = new DateHolder();
        holder.date = new Date();
        System.out.println("date in holder: "+holder.date);
        Date outsideDateRef = holder.date;
        outsideDateRef.setTime(1l);
        //will be different, although we did not change anything in the holder object.
        System.out.println("date in holder: "+holder.date);
    }
}

перенос переменной даты с помощью метода get и метода set, которые работают только со значением, а не со ссылкой, предотвратит это:

public class DateHolder() {
    private Date date;
    public Date getDate() {
       return (Date)this.date.clone();
    }
    public void setDate(Date date) {
       this.date = (Date) date.clone();
    }

    public static void main(String... args) {
        DateHolder holder = new DateHolder();
        holder.setDate( new Date() );
        System.out.println("date in holder: "+holder.getDate());
        Date outsideDateRef = holder.getDate();
        outsideDateRef.setTime(1l);
        //Date in holder will not have changed
        System.out.println("date in holder: "+holder.getDate());
    }
}
2 голосов
/ 27 августа 2011

Сначала вы должны прочитать о абстракция , инкапсуляция и OOP , чтобы понять о методах доступа, мутаторах, неизменяемости и доступе к данным.

2 голосов
/ 27 августа 2011

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

Также это не обязательно должен быть getName или setName, но это просто позволяет понять, что делает функция.

2 голосов
/ 27 августа 2011

Это обычная схема проектирования, заключающая в себе процессы «получения» и «установки» переменных в методах. Это дает вам больше свободы, если вы когда-нибудь захотите изменить базовую реализацию.

Например, предположим, что однажды вы хотите изменить параметр girlName на объект Girl; Если вы напрямую обращаетесь к girlName из ваших внешних классов, вам придется изменить весь ваш внешний код.

Используя метод установки, вы можете просто изменить один метод и сделать

public void setGirlname(String name)
{
   girlname = new Girl(name, some_other_data);
}

Или, возможно, вы хотите убедиться, что girlname всегда возвращается в верхнем регистре.

public String getGirlname()
{
    return girlName.toUpperCase();
}

Таким образом, вы получаете больше гибкости в разработке кода.

1 голос
/ 26 июня 2012

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

чтобы изменить фактическую приватную переменную, нам теперь понадобятся public getter () или setter () Основные соглашения об именах говорят, что мы возьмем имя переменной и добавим к ней префикс get и / или set.

в вашем конкретном случае getGirlname будет правильным.

Мы называем это инкапсуляцией

0 голосов
/ 27 августа 2011

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

НТН

Иво Стойков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...