Преимущество методов set и get vs public variable
Возможный дубликат:
Зачем использовать геттеры и сеттеры?
Есть ли какое-либо преимущество в том, чтобы методы могли обращаться к закрытым переменным в вашем классе, а не публиковать переменную?
Например, второй случай лучше первого?
//Case 1
public class Shoe{
public int size;
}
//Case 2
public class Shoe{
private int size;
public int getSize(){
return size;
}
public void setSize(int sz){
size = sz;
}
}
Ответы
Ответ 1
То, что я когда-либо видел на SO, в качестве ответа (написано @ChssPly76), почему использовать геттеры и сеттеры
Потому что через 2 недели (месяцы, годы), когда вы понимаете, что ваш сеттер должен делать больше, чем просто установить значение, вы также поймете что свойство было использовано непосредственно в 238 других классах: -)
есть гораздо больше преимуществ:
- getters и setter могут иметь в них проверку, поля не могут
- Используя getter, вы можете получить подкласс от желаемого класса.
- геттеры и сеттеры являются полиморфными, поля не
- отладка может быть намного проще, поскольку точка останова может быть помещена внутри одного метода, не так много ссылок на это поле.
- они могут скрывать изменения реализации:
перед:
private boolean alive = true;
public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }
после
private int hp; // change!
public boolean isAlive() { return hp > 0; } // old signature
//method looks the same, no change in client code
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; }
EDIT: еще одно новое преимущество при использовании Eclipse - вы можете создать точку наблюдения в поле, но если у вас есть сеттер, вам нужна только точка останова и... точки останова (например, в методе setter) может быть условным, точки наблюдения (по полю) не могут. Поэтому, если вы хотите остановить свой отладчик, только если x=10
вы можете сделать это только с точкой останова внутри сеттера.
Ответ 2
Использование общедоступной переменной может привести к установке неправильных значений для переменной, поскольку значение не может быть проверено.
например:
public class A{
public int x; // Value can be directly assigned to x without checking.
}
Использование setter может использоваться для установки переменной с проверкой ввода. Сохранение private varibale экземпляра, а также геттера и сеттера - это форма Encapsulation
getter и setter также совместимы со стандартом Java Beans,
геттер и сеттер также
помогает в реализации концепции полиморфизма
например:
public class A{
private int x; //
public void setX(int x){
if (x>0){ // Checking of Value
this.x = x;
}
else{
System.out.println("Input invalid");
}
}
public int getX(){
return this.x;
}
Полиморфный пример: Мы можем назначить переменную Object Refernce типа Sub как аргумент метода вызова для переменной Object Refernce переменной суперкласса параметра Called.
public class Animal{
public void setSound(Animal a) {
if (a instanceof Dog) { // Checking animal type
System.out.println("Bark");
}
else if (a instanceof Cat) { // Checking animal type
System.out.println("Meowww");
}
}
}
Ответ 3
- Некоторые библиотеки требуют, чтобы это выполняло "стандарт Java Bean".
- Установщик/получатель может находиться в интерфейсе, свойство не может находиться в интерфейсе
- Сеттеры/геттеры могут быть легко переопределены в спускаемых классах.
- seters/getters абстрагируют информацию о том, вычисляется ли значение по требованию или просто аксессуар для свойства
Ответ 4
Несколько назад взгляд на вещи.
Есть ли какие-либо обстоятельства, когда лучше разоблачить внутреннюю работу вашего класса, сделав переменную-член общедоступной, поэтому любой ее пользователь может делать то, о чем дизайнер никогда не убеждался, что привело к празднику неудач и рог изобилия сбоев
На самом деле ответы на вопрос, что это не так?
Принцип краеугольного камня OO, инкапсуляция. Публичная переменная-член в основном является глобальной переменной с префиксом...