2012-06-17 10 views
29

Eventuali duplicati:
Why use getters and setters?vantaggio di metodi set e get vs variabile pubblica

C'è qualche vantaggio a rendere i metodi per accedere alle variabili private nella classe invece di fare il pubblico variabile ?

Ad esempio il secondo caso è migliore del primo?

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

possibile duplicato di [Perché utilizzare getter e setter?] (Http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) e [Getter e setter implementati automaticamente rispetto ai campi pubblici] (http://stackoverflow.com/questions/111461) –

risposta

59

Quello che ho visto un giorno su SO, come risposta (scritto da @ ChssPly76) perché utilizzare getter e setter

causa 2 settimane (mesi, anni) da oggi, quando ti rendi conto che la tua setter ha bisogno di fare di più che impostare il valore, avrete anche conto che la proprietà è stata usata direttamente in 238 altre classi :-)

ci sono vantaggi molto di più:

  1. getter e setter possono avere convalida in loro, i campi non
  2. possono utilizzare si getter può ottenere sottoclasse di classe desiderato.
  3. getter e setter sono polimorfici, campi non
  4. sono debug può essere molto più semplice, in quanto punto di interruzione può essere inserito all'interno di un metodo non vicino molti riferimenti di quel determinato campo.
  5. possono nascondere implementazione cambia:

prima:

private boolean alive = true; 

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

dopo:

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: un ulteriore nuovo advange quando si utilizza Eclipse - si puoi creare watchpoint sul campo, ma se hai setter hai bisogno solo un punto di interruzione e ... punti di interruzione (ad es. nel metodo setter) può essere condizionale, i watchpoint (sul campo) non possono. Quindi se vuoi fermare il tuo debugger solo se x=10 puoi farlo solo con breakpoint dentro setter.

+0

getter e setter le parti buone (http://pawel-michalski-javnie.blogspot.de/2012 /04/gettery-settery-enkapsulacja-czy.html) non è affatto divertente ... perché dargli un titolo inglese e procedere con un linguaggio strano ... –

+1

@MatthisKohli Spiacente, hai ragione. Ho rimosso quel collegamento. – dantuch

4
  1. Alcune librerie richiedono che questo soddisfi lo "standard Java Bean".
  2. Un setter/getter può essere in un'interfaccia, una proprietà non può essere in un'interfaccia
  3. I setter/getter possono essere sovrascritti facilmente nelle classi discendenti.
  4. setter/getter astrarre l'informazione se un valore viene calcolato su richiesta o solo una funzione di accesso a una proprietà
6

Utilizzando variabile pubblica può causare l'impostazione dei valori sbagliati per la variabile come il valore ingresso non può essere verificata .

es:

public class A{ 

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

    } 

Uso setter può essere utilizzato per impostare la variabile con controllando l'ingresso. Mantenere l'istanza varibale privato e getter e pubblico setter è una forma di incapsulamento getter e setter è inoltre compatibile con Java Beans standard di,

getter e setter anche aiuta a attuazione polimorfismo concetto

esempio:

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

esempio polimorfico: Possiamo Assig n Oggetto Refernce Variabile del sottotipo come argomento dal metodo di chiamata alla variabile di riferimento dell'oggetto del parametro Super Class del metodo chiamato.

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

modo un po 'indietro di vedere le cose.

Ci sono circostanze in cui è meglio esporre il funzionamento interno della classe rendendo pubblica una variabile membro, così ogni consumatore può fare cose che il progettista non ha mai concepito, portando ad una festa del fallimento e ad una cornucopia di si blocca?

Una sorta di risposte in sé è davvero quella che non si fa?

Principio della pietra angolare di OO, incapsulamento. Una variabile membro pubblico è fondamentalmente una variabile globale con un prefisso ...

+4

Ci sono buone ragioni per non usare getter e setter: ingombrano il codice, rendendolo più difficile da leggere e violano il principio DRY. In effetti, in linguaggi con proprietà, è normale rendere pubbliche le cose (dato che può essere riadattato in proprietà in seguito se è davvero necessario). – Antimony

+0

@Antimony. Non è il posto per un dibattito, ma non posso essere d'accordo, nemmeno un po '. Ho visto fin troppe istanze quella sorta di scorciatoia erm, che ha causato molto più lavoro del semplice refactoring di una proprietà. Molto, molto altro. –