Подтвердить что ты не робот

Преимущество методов 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;
    }

}
4b9b3361

Ответ 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, инкапсуляция. Публичная переменная-член в основном является глобальной переменной с префиксом...