Разница между myClassInstance.property и myClassInsance.getProperty ()? - PullRequest
1 голос
/ 28 марта 2012

Я новичок в Java, и я хотел бы спросить, в чем плюсы и минусы по этому поводу:

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

myClassInstance.name = "Jones"
myClassInstance.job = "Manager"

System.out.println(myClassInstance.name);
System.out.println(myClassInstance.job);

Почему лучше, если я делаю геттеры и сеттеры и делаю так:

myClassInstance.setName("Jones");
myClassInstance.setJob("Manager");

System.out.println(myClassInstance.getName());
System.out.println(myClassInstance.getJob());

Ответы [ 5 ]

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

Этот вопрос относится к одному из основных принципов проектирования ОО: инкапсуляция!

Средства доступа (также известные как методы получения и установки) - это методы, которые позволяют вам читать и записывать значение переменной экземпляра объекта

public class AccessorExample {
private String attribute;

public String getAttribute() {
 return attribute;
}

public void setAttribute(String attribute) {
 this.attribute = attribute;
}
}

Зачем их использовать?

Getter и Setters делают API более стабильными. Рассмотрим поле public в классе, к которому обращаются другие классы. Позже вы захотите добавить дополнительную логику при получении и установке переменной. Это повлияет на существующего клиента, который использует API. Таким образом, любые изменения в этом общедоступном поле потребуют изменений для каждого класса, который ссылается на него. Напротив, с помощью методов доступа можно легко добавить некоторую логику, например, кешировать некоторые данные, а потом их лениво инициализировать. Кроме того, можно запустить событие изменения свойства, если новое значение отличается от предыдущего значения. Все это будет беспрепятственно для класса, который получает значение с помощью метода доступа.

Также методы получения и установки позволяют использовать разные уровни доступа, например. Get может быть общедоступным, но Набор может быть защищен.

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

прямой доступ к полям приведет к нарушению инкапсуляции .

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

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

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

class Bottle {
    public int volume = 0;
}

class EncapsulatedBottle {
    private int volume = 0;

    public void setVolume(int volume) throws Exception {
        if (volume < 1) {
            throw new Exception("A bottle cannot have a negative volume");
        }
        this.volume = volume;
    }
    public int getVolume() {
        return this.volume;
    }
}

Найдите разницу: -)

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

Использование методов получения / установки обычно лучше, потому что:

  • вы можете ограничить (общедоступный) доступ только для чтения (без установки)
  • вы можете добавить дополнительный код без перекомпиляции/ изменить пользователей свойства (т. е. классов, которые вызывают метод получения / установки)
  • оно соответствует спецификации Java Bean, в которой указано, что свойство должно иметь методы получения / установки - и многие библиотеки /фреймворки, такие как Java EL и т. д. полагаются на этот контракт
1 голос
/ 28 марта 2012

Использование методов получения и установки дает вам больший контроль над достоверностью ваших объектов, дает вам возможность проверить значения, которые установлены, чтобы убедиться, что они являются разумными, и т. Д. (И, конечно, для свойств только для чтения, вы просто не включайте сеттер.) В современной JVM с компилятором, работающим точно в срок, они, по сути, ничего не стоят; если они действительно просто читают и пишут в приватный элемент данных, и если они находятся в точке доступа (фрагмент кода, который используется lot ), JIT встроит их.

...