2012-08-09 12 views
9

Eventuali duplicati:
Why use getters and setters?Necessità di metodi getter

Questa è una domanda newbie. È molto necessario utilizzare getmethods per accedere ai valori delle proprietà? Una volta che il valore è stato assegnato, si può ottenere la directory dei valori. Ad esempio, nel codice seguente, displayName() può visualizzare il valore firstName senza l'aiuto di alcun metodo getter. Oppure è uno standard di codifica standard che si deve avere il metodo getter and setter o altri metodi che danno quel valore?

class Test{ 

    private String firstName; 

    public void setName(String fname){ 
     firstName = fname; 
    } 

    public void displayName() { 
     System.out.println("Your name is " + firstName); 
    } 
}   

risposta

12

Tell, Don't Ask è un principio importante nella progettazione orientata agli oggetti. In genere dovresti dire agli oggetti di fare cose piuttosto che porre loro delle domande. getter/setter ogni dove scoraggiare questa pratica, perché sei incoraggiato a raggiungere un oggetto e raggiungere i campi (o ancora peggio a raggiungere e colpire le cose nel caso di setter). Questo rompe l'incapsulamento e rende il tuo codice più difficile da ragionare.

Nel tuo caso particolare, creerei un oggetto chiamato Name che ha un costruttore che prende il nome e il metodo singolo per visualizzarlo.

2

usano sempre getter e setter per accedere alle proprietà!

Si dovrebbe dare un'occhiata a this article...

+3

anche in caso di classi private del pacchetto e classi nidificate? – Eugene

+3

Questo vale anche se si desidera accedere al campo all'interno della classe (come in questo esempio)? Io non la penso così ... L'articolo parla solo di accesso esterno e uso alternativo di campi pubblici (che sono d'accordo dovrebbe essere tenuto al minimo). – brimborium

4

nel tuo caso (per visualizzare il nome visualizzato), non è necessario da fornire Getter.

Ma se vostro voglia utilizzare il campo in un'altra classe Abbiamo bisogno di fornire il metodo Getter.

3

Getter e setter sono una parte dell'interfaccia standard per Java Beans e molti framework come Hibernate li aspettano al loro posto. Detto questo, naturalmente, spetta a te decidere se e quando ne hai bisogno e per quale scopo. Forniscono accesso alle variabili dei membri privati ​​e possono anche darvi la possibilità di fare qualcosa di più che semplicemente ottenere e impostare.

Il punto del software OO è riutilizzo. Ciò significa che altri programmatori, o anni a partire da ora, possono utilizzare il codice per altri sistemi.

Quando si dispone di variabili membro private e si utilizzano le funzioni get/set, è possibile modificare l'implementazione interna della funzione senza interrompere tutti gli altri codici che la utilizzano.

2

Avendo stato privato, incapsulamento è buono, e in molti casi questo è la cosa giusta. Supponiamo che la tua classe supponga di essere thread safe, con campi pubblici che non puoi garantire.

D'altra parte ci sono casi in cui questo è inutile! Supponiamo che tu acceda al tuo oggetto solo in un unico pacchetto, sei certo che non lo esporterai mai, quindi perché preoccuparsi?

+1

abbastanza sicuro che puoi con la parola chiave 'volatile'. – Woot4Moo

+2

@ Woot4Moo l'unica cosa che si assicurerà con volatilità è la visibilità, che non è sufficiente per la sicurezza dei thread – Eugene

+1

questo sembra non essere d'accordo: http://stackoverflow.com/questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo

2

Non ho alcun collegamento per supportare questo, ma è quello che faccio.

cerco di evitare i campi pubblici, se non sono statici. Quindi uso solo campi protetti e privati. Dall'interno della classe, puoi accedervi senza get/set, è tutto a posto. Dall'esterno della classe, cerca sempre di usare get/set.

Quindi il codice di esempio è perfettamente valido per me. :)

EDIT: Un'eccezione per me è se creo un struct -come classe contenitore come questo

class Point4D { 
    public int x1, x2, x3, x4; 
} 

Poi penso che i campi pubblici sono ok. Sarebbe ancora meglio renderli privati ​​e nominare i getters public int x1() ecc. Non appena vengono introdotti in questo contenitore alcuni metodi che modificano lo stato dell'istanza (come la modifica dei valori di x1/x2/x3/x4), li rendono privati ​​e aggiungo get/set.

Problemi correlati