Преимущество методов set и get по сравнению с публичной переменной [duplicate]

Possible Duplicate:
Why use getters and setters?

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

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

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

}
 Tomasz Nurkiewicz17 июн. 2012 г., 14:55

Ответы на вопрос(4)

Решение Вопроса

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

Because 2 weeks (months, years) from now when you realize that your setter needs to do more than just set the value, you'll also realize that the property has been used directly in 238 other classes :-)

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

getters and setter can have validation in them, fields can't using getter you can get subclass of wanted class. getters and setters are polymorphic, fields aren't debugging can be much simpler, because breakpoint can be placed inside one method not near many references of that given field. they can hide implementation changes:

до:

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 - вы можете создать точку наблюдения на поле, но если у вас есть сеттер, вам нужна просто точка останова, и ...breakpoints (e.g. in setter method) can be conditional, watchpoints (on field) cannot, Так что если вы хотите остановить ваш отладчик, только еслиx=10 Вы можете сделать это только с точкой останова внутри сеттера.

 28 апр. 2016 г., 09:00
@MatthisKohli Извините, вы правы. Я удалил эту ссылку.

Использование публичной переменной может привести к установке неправильных значений в качестве переменнойinput value cannot be checked.

например:

 public class A{

    public int x;   // Value can be directly assigned to x without checking.

   }

Использование setter может использоваться для установки переменной сchecking the input, Сохранение экземпляра varibale частным, а getter и setter public - это формаEncapsulation геттер и сеттер также совместимы сJava Beans standard,

геттер и сеттер также помогает вimplementing polymorphism concept

например:

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

Полиморфный пример:We can assign Object Refernce Variable of the Sub type as Argument from Calling method to the Object Refernce Variable of Super Class Parameter of the Called method.

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");

             }
         }
      }
Some libraries require this to fulfill the "Java Bean standard". A setter/getter can be in an interface, a property cannot be in an interface Setters/getters can easily be overridden in descended classes. setters/getters abstract away the information whether a value is calculated on demand or just an accessor to a property

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

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

Что-то вроде ответов на самом деле, что каждый делает это?

Краеугольный принцип ОО, инкапсуляция. Открытая переменная-член - это в основном глобальная переменная с префиксом ...

 17 июн. 2012 г., 20:14
@Antimony. Не место для дебатов, но я не могу согласиться, даже немного. Я видел слишком много случаев, когда подобные ярлыки вызывали гораздо больше работы, чем просто рефакторинг свойства. Многое, многое другое
 17 июн. 2012 г., 16:51
Есть веские причины не использовать геттеры и сеттеры - они загромождают код, затрудняя его чтение и нарушая принцип СУХОЙ. Фактически, в языках со свойствами обычно просто делать вещи публичными (поскольку они могут быть преобразованы в свойства позже, если это действительно необходимо).

Ваш ответ на вопрос