WinstonSmith ha scritto:
Mutable class members should never be returned to a caller or accepted and stored directly. Doing so leaves you vulnerable to unexpected changes in your class state.
Riguardo questa affermazione, c'è da fare una doverosa precisazione. NON è ovviamente sempre tassativamente obbligatorio fare così! Dipende "chi" è il chiamante. Cioè bisogna conoscere bene anche il contesto in cui si opera.
Se stai facendo una libreria che sarà poi usata da tante altre persone e non sai ovviamente chi/come userà la tua libreria ... allora sì, sarebbe bene prestare molta attenzione a questi aspetti di mutabilità vs immutabilità.
Se invece stai facendo una singola applicazione, che è tutta sotto il tuo controllo .... beh, qui non è detto che devi andare a "cercare il pelo nell'uovo" su questi aspetti sempre e ovunque. Dipende ...
Quindi quella affermazione va bene ma è da prendere con le "pinze" e da valutare/applicare in modo oculato secondo lo scenario specifico che si ha.
WinstonSmith ha scritto:
ma se provo a clonare come faccio nel get mi chiede o di castare a Date o di cambiare il tipo di ritorno in Object, sembrndomi entrambe le soluzioni poco valide, cosa posso fare per evitare ciò?
Il Date (di java.util) ha un clone() ma ha come tipo statico di ritorno Object, non Date.
Mettere nel tuo getter Object come tipo di ritorno, NO, non ha senso (sarebbe molto peggio). Il male minore sarebbe mettere un cast a Date:
return
(Date) data.clone();
che comunque sbagliato non è. Se non ti piace il cast, si può sempre creare direttamente un nuovo Date:
return new Date(data.getTime());
Attenzione che se quel campo data
può essere null, devi prenderlo in considerazione.