Что такое хорошая практика для доступа к атрибутам класса в методах класса? - PullRequest
3 голосов
/ 21 апреля 2010

Меня всегда интересует лучший способ доступа к атрибуту класса из метода класса в Java.

Не могли бы вы быстро убедить меня, какое из трех приведенных ниже решений (или совершенно другое: P) является хорошей практикой?

public class Test {

    String a;


    public String getA(){
        return this.a;
    }

    public setA(String a){
        this.a = a;
    }

    // Using Getter
    public void display(){

        // Solution 1
        System.out.println(this.a);

        // Solution 2
        System.out.println(getA());

        // Solution 3
        System.out.println(this.getA());
    }


    // Using Setter
    public void myMethod(String b, String c){

        // Solution 1
        this.a = b + c;

        // Solution 2
        setA(b + c);

        // Solution 3
        this.setA(b + c);
    }
}

Ответы [ 7 ]

3 голосов
/ 21 апреля 2010

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

Лично я бы просто поддерживал методы получения и установки «чистыми» в соответствии со спецификацией Javabean и добавлял еще один метод получения или установки с самоочевидным именем метода всякий раз, когда я хотел бы сделать что-то большее, чем просто получение / установка значения.Например, getAndIncrement(), getAsString(), setAsInt(String) и т. Д.

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

2 голосов
/ 21 апреля 2010

Если вам потребуется создать какую-либо проверку в будущем, вам понадобится установщик / получатель. Когда вы делаете переменную видимой, вы тормозите инкапсуляцию класса. Теоретически это означает, что ваш код не является объектно-ориентированным: P, но на практике вы теряете способность выполнять много рефакторингов кода. Например, извлечение интерфейса. И для этого вызова, я думаю, что это избыточно, но это только я:)

0 голосов
/ 21 апреля 2010

Использование setA(b + c) глупо.

Геттеры и сеттеры являются частью интерфейса . Методы уже имеют полный доступ к состоянию. Будьте откровенны с этим.

Если вы беспокоитесь, что вы можете нарушить инвариант, тогда ваш класс слишком сложен для вас. (Примите это и рефакторинг.)

0 голосов
/ 21 апреля 2010

Решение 2 или 3 - лучшая практика, поскольку они обеспечивают инкапсуляцию в полевых условиях. Например, что если поле 'a' является почтовым индексом пользователя, а в вашем приложении есть новое требование всегда возвращать почтовый индекс в верхнем регистре. С решениями 2 или 3 это становится тривиальным. Э.Г.

private String postcode;
public String getPostcode()
{
   return postcode;
}

становится

private String postcode;
public String getPostcode()
{
   return postcode != null? postcode.toUppercase() : null;
}

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

0 голосов
/ 21 апреля 2010

Я использую методы получения и установки в классе, если есть больше логики, которая просто возвращает this.value. Таким образом, я избегаю дублирования. Пример:

...
public List<String> getList() {

    if (this.list == null) {
        this.list = new LinkedList<String>();
    }

return this.list;

}

public int getListSize() {
    return getList().size();
}
...

Я всегда использую «это», потому что другим людям легче читать мой код. Нет сомнений в том, что this.value является атрибутом класса, тогда как value может быть как локальной переменной, так и атрибутом класса.

0 голосов
/ 21 апреля 2010

Я бы пошел с

System.out.println(getA());

и

setA(b + c);

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

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

0 голосов
/ 21 апреля 2010

Использование геттеров и сеттеров - путь.

  • Это общепринятая практика

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

  • Это дает возможность автору класса в будущем

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

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

Также - this.a является членом экземпляра (по одному на экземпляр), а не членом класса (один на класс, будет статическим). Еще одна причина для использования this, чтобы быть ясным.

...