2016-06-21 12 views
5

Recentemente ho ricevuto un commento di revisione del codice per utilizzare il metodo getter per accedere alla variabile di istanza privata all'interno dei metodi della stessa classe. È davvero una buona pratica? Sento che sta aggiungendo inutili complicazioni nel codice. Qual è il modo consigliato?È buona pratica di codifica utilizzare getter per accedere a variabili di istanza private

public class SomeClass { 
    String abc; 

    public boolean compare(SomeClass otherClass) { 
     otherClass.getAbc().equals(abc); 
    } 
} 

public class SomeClass { 
    String abc; 

    public boolean compare(SomeClass otherClass) { 
     otherClass.getAbc().equals(getAbc()); 
    } 
} 
+3

Di solito non mi preoccupo. Sono in classe e i dati appartengono alla classe. – azurefrog

+1

Quando nella stessa classe, non c'è motivo di usare getter e setter. Sono lì solo per esporre le variabili private in modo controllato. –

risposta

5

Vedo un problema molto specifico con il primo approccio. Stai usando i getter in modo incoerente.

public boolean compare(SomeClass otherClass) { 
    otherClass.getAbc().equals(abc); 
    //.getAbc() for one, but direct access for the other!! 
} 

è necessario confrontare le mele alle mele per un metodo uguale, e se uno dei vostri variabili viene recuperato per il confronto con un getter (che presumo è pubblico e può essere ignorato) e l'altro viene recuperato direttamente dal una variabile privata (che non può essere sovrascritta), quindi hai reso il tuo codice molto più fragile di quanto debba essere. Cosa succede se qualcuno estende la tua classe e cambia il metodo getter? Il tuo codice verrà hosed. Pertanto, utilizzare un getter su entrambi o nessuno.

Con questo in mente, uno di questi è meglio che l'originale, dal momento che il comportamento è più stabile:

public boolean compare(SomeClass otherClass) { 
    otherClass.abc.equals(abc); 
} 


public boolean compare(SomeClass otherClass) { 
    otherClass.getAbc().equals(getAbc()); 
} 

Per scopi generali, dipende da come si sta utilizzando i dati. La risposta di David elenca alcune risorse per l'uso generale dei getter.

È del tutto possibile che il vostro revisore stia parlando solo del caso generale, ma penso che possano aver appena comunicato il problema in modo insufficiente.

+0

Ho sentito lo stesso commento della recensione cantato come un mantra. Lavoro con un sacco di codice che ha getter e setter generici e sembra sempre uno spreco. Dopo aver letto gli articoli che ho collegato penso di aver imparato un po 'di più sul design incapsulato migliore. Sospetto che anche molti revisori non capiscano molto bene l'incapsulamento. –

3

In teoria, l'utilizzo di getter e setter all'interno della classe potrebbe fornire il riutilizzo del codice, ad esempio se il setter esegue un tipo di controllo di intervallo utile anche all'interno della classe. In pratica non ho mai visto un caso in cui ciò fosse davvero vantaggioso.

Idealmente una classe non dovrebbe avere setter e getter.

Perché nessun setter? Perché forniscono uno stato mutabile che causa un sacco di problemi. Le variabili di classe dovrebbero idealmente essere assegnate nel costruttore e non cambiarle più tardi.

Perché nessun getter? Perché una classe dovrebbe agire come una unità. Il punto di creare una classe non è solo quello di fornire un contenitore temporaneo per variabili diverse solo per estrarle successivamente, uno per uno. Questo non è incapsulamento.