2013-05-14 2 views
20

Nei miei anni di programmazione ho spesso creato classi che raggruppano semplicemente alcune variabili con i loro setter e getter. Ho visto questi tipi di oggetti denominati oggetti valore, oggetti dominio o oggetti modello a seconda del contesto in cui vengono utilizzati. Il termine più adatto per l'uso generico sembra essere il Data Transfer Object (DTO). Questo descrive un POJO che contiene solo accessori e mutatori.Campi pubblici in un oggetto di trasferimento dati

Ho appena scritto uno di questi oggetti che contiene circa cinquanta campi utilizzati per impostare i parametri del tema su un grafico. Ora mi chiedo se invece di generare un centinaio di gettatori e setter dovrei semplicemente dichiarare questi campi come pubblici. Fare così va contro tutto ciò che i miei istinti di programmazione mi dicono ancora non posso negare che aumenterebbe notevolmente la leggibilità del mio codice e ridurrebbe la quantità di codice boilerplate nella classe.

L'unico motivo per cui posso vedere non per utilizzare i campi pubblici sarebbe se avessi bisogno di eseguire qualsiasi tipo di convalida su questi campi. Se supponiamo che la convalida del tipo sia sufficiente per i miei scopi, sta usando i campi pubblici in questo scenario una rottura accettabile dalla progettazione orientata agli oggetti? Un DTO pubblico funzionerà meglio con operazioni batch di grandi dimensioni?

+0

Eventuali duplicati - http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – sanbhat

+0

getter e setter sono necessarie se cerchi di usare i framework 'DI' come' Spring' o qualcosa come 'jsp: useBean' etc !!! – NINCOMPOOP

+0

@sanbhat: alcuni dei motivi indicati nella risposta accettata a questa domanda si applicano qui, ma non tutti. Lo scopo e il comportamento di un DTO sono diversi da quelli generici, quindi mi chiedevo se in questo caso si sarebbero applicate "regole" diverse. – Lilienthal

risposta

23

La maggior parte dei programmatori imposterà automaticamente i campi privati ​​con getter/setter senza pensarci. Ma come ogni cosa di culto del cargo, è meglio prendere una decisione consapevole.

Il motivo principale per l'utilizzo di una combinazione getter/setter anziché di un campo pubblico è che è possibile modificare la definizione. Quindi, se il DTO fa parte di un'interfaccia tra componenti, è meglio usare i getter. Se cambi il funzionamento interno, puoi adattare il getter per simulare il vecchio comportamento e mantenere la compatibilità.

Un'altra ragione è che è possibile creare campi di sola lettura. Spesso per DTO, la sola lettura e l'immutabile sono una buona scelta.

Un terzo motivo potrebbe essere che il DTO deve essere un javabean perché si intende utilizzarlo in alcuni strumenti che lo richiedono.

Se nessuna di queste proprietà è adatta a te, non c'è motivo di non utilizzare i campi pubblici.

Non aspettatevi molto di una differenza di prestazioni però :)

+1

Proprio quello che dovevo sapere.Se riassumo, sembra che la decisione sull'opportunità o meno di utilizzare i campi pubblici dipenda dallo scopo del progetto, indipendentemente dal fatto che verrà riutilizzato o interfacciato e dalla probabilità di cambiamento. Inoltre non avevo considerato che i campi non primitivi del 'finale 'non sarebbero immutabili. Se volessi creare un campo di sola lettura, dovrei convertire l'intera classe per mantenere un accesso uniforme. – Lilienthal

+2

Più uno per l'immutabilità. Considera anche piuttosto che usare setter se puoi usare il pattern Builder. Quindi la maggior parte del tuo accesso avverrà tramite getter, consentendo di restituire immutabili o copie sicure di elementi che non vuoi influenzare indirettamente tramite effetti collaterali. –

3

Non credo che sia una pratica terribilmente male avere una classe "settings" o "theme" o "style" con attributi pubblici.

Gli IDE moderni con strumenti di refactoring rendono banale la promozione di un attributo a getter/setter se si desidera eseguire calcoli complicati o verifiche sui valori al momento dell'impostazione.

Spesso nel proprio "setTheme" o qualsiasi funzione che utilizza queste classi di impostazioni è un buon punto pulito per eseguire la convalida.

Quando si impostano impostazioni come questa di solito è opportuno eseguire un oggetto copiato in profondità anziché conservare un riferimento a una classe mutabile.