2012-06-17 12 views
29

Powiel możliwe:
Why use getters and setters?zaletą zestawu i uzyskaj metody vs zmiennej publicznej

Czy jest jakaś zaleta dokonaniem metod dostępu do zmiennych prywatnych w klasie zamiast tworzenia zmiennej publicznej ?

Na przykład 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; 
    } 

} 
+0

możliwy duplikat [Dlaczego używać getterów i ustawiaczy?] (Http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) i [Auto-realizowane pobierające i ustawiające vs. publiczne pola] (http://stackoverflow.com/questions/111461) –

Odpowiedz

59

Co Widziałem kiedyś na SO, jako odpowiedź (napisany przez @ ChssPly76) dlaczego używać pobierające i ustawiające

ponieważ 2 tygodnie (miesiące, lata) od teraz, kiedy okazuje się, że seter musi zrobić więcej, niż tylko ustawić wartość, można także zrealizować że nieruchomość została wykorzystana bezpośrednio w 238 innych klasach :-)

istnieje znacznie więcej zalet:

  1. pobierające i seter może mieć walidacji w nich pola nie
  2. można stosując getter Możesz dostać podklasę z poszukiwanych klasie.
  3. pobierające i ustawiające są polimorficzne, pola nie
  4. są debugowanie może być znacznie prostsze, gdyż przerwania może być umieszczony wewnątrz jedna metoda nie pobliżu wielu odniesień do tej danej dziedzinie.
  5. potrafią ukryj realizacja zmienia:

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 gdy używasz Eclipse - ci może tworzyć punkt obserwacyjny na polu, ale jeśli masz setera, którego potrzebujesz tylko punkt przerwania i ... punkty przerwania (np. w metodzie ustawiającej) może być warunkowe, punkty obserwacyjne (na polu) nie mogą być. Więc jeśli chcesz zatrzymać debugger tylko jeśli x=10 możesz to zrobić tylko z punktem przerwania wewnątrz settera.

+0

pobierające i ustawiające dobre części (http://pawel-michalski-javnie.blogspot.de/2012 /04/gettery-settery-enkapsulacja-czy.html) wcale nie jest śmieszne ... czemu nadać mu angielski tytuł i przejść dziwnym językiem ... –

+1

@MatthisKohli Przepraszam, masz rację. Usunąłem ten link. – dantuch

4
  1. Niektóre biblioteki wymagają tego, aby spełnić "standard Java Bean".
  2. Setter/getter może znajdować się w interfejsie, właściwość nie może znajdować się w interfejsie.
  3. Settery/gettery można z łatwością przesłonić w klasach zstępujących.
  4. ustawiaczy/getters abstrakcyjne dala informacji czy wartość jest obliczana na żądanie lub po prostu akcesor do nieruchomości
6

Korzystanie zmiennej publicznej może spowodować ustawienie błędne wartości do zmiennej jako wartość wejściowy nie może być sprawdzana .

np

public class A{ 

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

    } 

Korzystanie setter może być użyty do ustawienia zmiennej z sprawdzając wejście. Utrzymanie instancji varibale prywatne i getter i setter publicznych jest formą Encapsulation getter i setter jest również kompatybilny z Java Beans standardowych,

getter i setter również pomaga w realizacji Concept polimorfizmu

np

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

polimorficzne przykład: Możemy assig n Odniesienie do obiektu Zmienna typu podrzędnego jako argument od metody wywołania do zmiennej odereno- wania obiektowego parametru super klasy wywoływanej 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"); 

      } 
     } 
     } 
0

Nieco wstecz sposób patrzenia na rzeczy.

Czy są jakieś okoliczności, w których lepiej jest ujawnić wewnętrzne funkcjonowanie twojej klasy poprzez uczynienie zmiennej członkowskiej publiczną, aby każdy jej konsument mógł robić rzeczy, których projektant nigdy nie otrzymał, prowadząc do uczty porażki i róg obfitości awarie?

Sama odpowiedź na takie pytanie, że tak się nie dzieje?

Podstawowa zasada OO, hermetyzacja. Publiczna zmienna składowa jest w zasadzie zmienną globalną z prefiksem ...

+4

Istnieją powody, dla których nie należy używać programów pobierających i ustawiających - zagracają kod, utrudniając czytanie i naruszają zasadę DRY. W rzeczywistości, w językach z właściwościami, zwykłe jest po prostu upublicznianie (ponieważ może być refaktoryzowane do właściwości później, jeśli jest to naprawdę konieczne). – Antimony

+0

@Antimony. Nie jest to miejsce na debatę, ale nie mogę się z tym zgodzić, nawet odrobinę. Widziałem zbyt wiele przypadków tego rodzaju skróconego skrótu, spowodowało to znacznie więcej pracy niż tylko refaktoryzacja nieruchomości. O wiele wiele więcej. –

Powiązane problemy