Преимущество методов set и get vs public variable

Возможный дубликат:
Зачем использовать геттеры и сеттеры?

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

Например, второй случай лучше первого?

//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; } } 

То, что я видел когда-нибудь на SO, в качестве ответа (написано @ ChssPly76), почему использовать геттеры и сеттеры

Поскольку через 2 недели (месяцы, годы) вы осознаете, что ваш сеттер должен делать больше, чем просто установить значение, вы также поймете, что свойство было использовано непосредственно в 238 других classах 🙂

есть гораздо больше преимуществ:

  1. getters и setter могут иметь валидацию в них, поля не могут
  2. используя getter, вы можете получить подclass желаемого classа.
  3. геттеры и сеттеры являются полиморфными , поля не являются
  4. отладка может быть намного проще, поскольку точка останова может быть помещена внутри одного метода, не так много ссылок на это поле.
  5. они могут скрыть изменения реализации :

до:

 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 вы можете сделать это только с точкой останова внутри сеттера.

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

например:

  public class A{ public int x; // Value can be directly assigned to x without checking. } 

Использование setter может использоваться для установки переменной с проверкой ввода . Сохранение private varibale экземпляра, а также getter и setter public – это форма инкапсуляции getter и setter, также совместимая со стандартом Java Beans ,

геттер и сеттер также помогают в реализации концепции polymorphismа

например:

 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; } 

Полиморфный пример. Мы можем назначить переменную объекта Refernce Variable типа Sub как аргумент метода вызова для переменной Object Refernce переменной суперclassа параметра вызываемого метода.

 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"); } } } 
  1. Некоторые библиотеки требуют, чтобы это выполняло «Java Bean standard».
  2. Установщик / получатель может быть в интерфейсе, свойство не может быть в интерфейсе
  3. Сеттеры / геттеры могут быть легко переопределены в спускаемых classах.
  4. сеттеры / геттеры абстрагируют информацию о том, вычисляется ли значение по требованию или просто аксессуар для свойства

Несколько назад взгляд на вещи.

Существуют ли какие-либо обстоятельства, когда лучше разоблачить внутреннюю работу вашего classа, сделав переменную-член публичной, так что любой потребитель ее может делать то, о чем дизайнер никогда не убеждался, что привело к празднику неудач и рог изобилия катастроф?

На самом деле, ответы на них не соответствуют действительности?

Основополагающий принцип OO, инкапсуляция. Публичная переменная члена – это в основном глобальная переменная с префиксом …

  • Неоднозначные методы варгара
  • Обнаружить версию целевой рамок во время компиляции
  • Почему у этого метода Java есть два типа возврата?
  • Создание аргументов java-метода в качестве окончательного
  • Что такое метод вложения?
  • Почему я не могу объявлять статические методы в интерфейсе?
  • Как отобразить все методы объекта?
  • Java Inheritance - вызов метода суперclassа
  • Должны ли статические статические методы C #, которые * могут быть статическими?
  • Как перехватить вызов метода со стандартными функциями Java (без AspectJ и т. Д.)?
  • Свойства vs Методы
  • Давайте будем гением компьютера.