Zaleta metod set I get vs zmiennej publicznej [duplikat]

Możliwy duplikat:
Dlaczego warto używać getterów i seterów?

Czy jest jakakolwiek korzyść w tworzeniu metod dostępu do prywatnych zmiennych w twojej klasie zamiast upubliczniania zmiennej?

Na przykład czy drugi przypadek jest lepszy od pierwszego?

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

}
Author: Community, 2012-06-17

4 answers

To, co kiedyś widziałem na SO, jako odpowiedź (napisany przez @ ChssPly76) dlaczego używać getterów i seterów

Ponieważ za 2 tygodnie (miesiące, lata) od teraz, kiedy zdasz sobie sprawę, że Twoje setter musi zrobić coś więcej niż tylko ustawić wartość, będziesz również realizować że właściwość została użyta bezpośrednio w 238 innych klasach: -)

Jest o wiele więcej zalet:

  1. gettery i setter mogą mieć w nich walidację, pola nie mogą
  2. używanie gettera możesz uzyskać podklasę poszukiwanej klasy.
  3. gettery i settery są polimorficzne, pola nie są
  4. debugowanie Może być znacznie prostsze, ponieważ punkt przerwania może być umieszczony wewnątrz jednej metody, Nie w pobliżu wielu referencji danego pola.
  5. mogą ukryć zmiany implementacji :

Przed:

private boolean alive = true;

public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }

Po:

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: jeden dodatkowy nowy advange podczas korzystania z Eclipse - można utworzyć watchpoint na polu, ale jeśli masz setter potrzebujesz tylko breakpoint, i... punkty przerwania (np. w metodzie setter) mogą być warunkowe, punkty kontrolne (w polu) nie mogą. Więc jeśli chcesz zatrzymać swój debugger tylko wtedy, gdy x=10 możesz to zrobić tylko z punktem przerwania wewnątrz settera.

 67
Author: dantuch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 06:59:24

Użycie zmiennej publicznej może spowodować ustawienie błędnych wartości zmiennej, ponieważ nie można sprawdzić wartości wejściowej .

Eg:

 public class A{

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

   }

Za pomocą settera można ustawić zmienną z sprawdzaniem wejścia . Zachowanie instancji varibale jako prywatnej, a getter i setter jako publicznej jest formą enkapsulacji getter i setter są również kompatybilne ze standardem Java Beans ,

Getter i setter także pomaga w realizacji polimorfizmu concept

Eg:

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

Przykład polimorficzny: możemy przypisać zmienną Object Refernce Sub typu jako Argument z wywołania metody do zmiennej Object Refernce Super Class parametru wywołanej metody.

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

             }
         }
      }
 7
Author: Kumar Vivek Mitra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 16:06:56
  1. niektóre biblioteki wymagają tego, aby spełnić "standard Java Bean".
  2. setter / getter może być w interfejsie, właściwość nie może być w interfejsie
  3. Settery / gettery mogą być łatwo nadpisywane w klasach potomnych.
  4. setters / getters streszczenie informacji, czy wartość jest obliczana na żądanie, czy tylko accessor do Właściwości
 4
Author: yankee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-17 12:55:57

Nieco wsteczny sposób patrzenia na rzeczy.

Czy są jakieś okoliczności, w których lepiej jest ujawnić wewnętrzne działanie swojej klasy poprzez upublicznienie zmiennej członkowskiej, aby każdy jej konsument mógł robić rzeczy, których projektant nigdy nie doświadczył, prowadząc do uczty niepowodzeń i rogu obfitości awarii?

W pewnym sensie sama odpowiada, że nie?

Zasada oo, hermetyzacja. Public member variable jest w zasadzie zmienną globalną z prefiks...

 0
Author: Tony Hopkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-17 13:27:35