2015-03-19 20 views
5

È comune nelle classi Java avere molti metodi getter e setter, uno per ogni variabile di classe del modello di dati. Mi rendo conto che molti IDE li creeranno per te, ma sto cercando di evitare questo disordine e di non avere tutti questi metodi nelle mie classi. Quindi, esiste un modo per accedere a una variabile in modalità read only al di fuori della classe (come se fosse public final), pur mantenendo l'accesso in scrittura all'interno della classe o sottoclasse in modo esclusivo (come se fosse privato o protetto).In Java, c'è un'alternativa migliore ai metodi getter e setter?

L'unica pseudo-soluzione che ho trovato è una classe base (o interfaccia con metodi predefiniti) che ha un metodo get (String variableName) che quindi ottiene i campi della classe tramite riflessione e restituisce quello appropriato . Lo svantaggio è che per farlo funzionare, le variabili devono essere pubbliche, quindi solo per convenzione soddisfa i miei requisiti (in quanto nella classe di estensione/implementazione che ha le variabili a cui voglio accedere, chiamo solo il metodo get da al di fuori della classe e non implementare un metodo set). La cosa principale che non mi piace è che se cambia un nome di variabile, i chiamanti dei metodi get non causano errori del compilatore, poiché il nome della variabile è solo una stringa hardcoded.

Qualcuno ha un'idea migliore?

+7

Sì. Ho un'idea migliore - * per favore non farlo *. * Reflection * è terribilmente lento. E non avendo setter/getter, rompi * l'incapsulamento * e * l'astrazione *. E se usi framework come * Spring *, avrai bisogno di setter. – TheLostMind

+2

Dovresti leggere una volta 'Effective java di Joshua Bloch'. – Prashant

+0

Se vuoi evitare il disordine, non scrivere getter e setter a meno che tu non ne abbia effettivamente bisogno. –

risposta

0

Java FX introdotto qualcosa di simile a ciò che si vuole: ReadOnlyProperty

Potrebbe non essere esattamente quello che stai cercando, però. In generale, non penso che esporre una variabile sia una buona idea.

+0

Oppure utilizzare le classi che implementano '' WritableValue'' come '' BooleanProperty'', '' LongProperty'', ...: http://docs.oracle.com/javafx/2/api/javafx/ fagioli/valore/WritableValue.html – nrainer

4

È possibile utilizzare lombok - per evitare manualmente il metodo getter e setter. Ma crea da solo.

L'utilizzo di lombok riduce notevolmente il numero di lotto del codice. L'ho trovato abbastanza carino e facile da usare. Ma qui puoi trovare alcuni pro e contro dell'uso di lombokhere.

Spero che possa essere d'aiuto.
Grazie mille.

4

Sì, prova a progettare le tue classi in modo da non avere getter e setter. In genere è un cattivo progetto avere getter e setter su tutti i campi perché interrompe l'incapsulamento. Un'eccezione è il caso di Java Beans (dove si ha una classe modello/DTO o una classe mappata su XML/JSON); qui non dovresti preoccuparti perché setter e getter sono gli unici metodi.

Nelle classi che hanno logica, iniettate le vostre dipendenze tramite costruttore o direttamente se usate Spring/CDI e vi piace. Questo è più sicuro perché non si avranno oggetti in stati incoerenti; ad esempio, si crea un oggetto ma si dimentica di chiamare un setter -> NullPointerException. Ma usando i costruttori, eviti il ​​caso di dimenticare di chiamare i setter.

Ovviamente potrebbero esserci delle eccezioni, come quando si impostano alcuni campi facoltativi quando non si desidera tutte le dipendenze nel costruttore in ogni momento. Questo tuttavia può essere risolto con il sovraccarico dei costruttori o, se il caso è più complesso, il problema può essere risolto in un modo più elegante utilizzando il modello di builder.

vedere un grande articolo su questo: http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html