Stavo leggendo Effective Java e mi sono imbattuto in passaggi che parlano dei modi in cui potresti implementare un singleton serializzabile, come se fosse una cosa perfettamente normale da fare in Java. Questo mi ha immediatamente sconcertato, perché la mia intuizione dice che:
- Essere serializzabili implica necessariamente semantica del valore.
- Essere un singleton implica necessariamente semantica di riferimento.
- La semantica del valore e dell'identità si escludono a vicenda.
L'autore di Java efficace sembra addirittura condividere almeno parte di questa intuizione, se sto leggendo questo passaggio successivo correttamente:
As a rule of thumb, value classes such as
Date
andBigInteger
should implementSerializable
, as should most collection classes. Classes representing active entities, such as thread pools, should rarely implementSerializable
.
Quando ho cercato il libro, questo sito e alcuni post del blog, ho trovato molti esempi in cui readResolve()
è poco più di return INSTANCE;
. Forse sono davvero pessimo con Java, ma una classe come quella mi sembra come se stesse dicendo "quando deserializzi un oggetto di questa classe, ignori completamente i dati serializzati e restituisca l'istanza esistente" il che implicherebbe che l'oggetto non sia effettivamente serializzabile in qualsiasi modo significativo Eppure c'è questa risposta SO che sembra dire "l'unico uso per readResolve()
è quello di rendere serializzabili serializzabili", quindi ... questo è il punto in cui mi sono arreso e ho iniziato a scrivere questa domanda.
Ci sono grossi equivoci in ciò che ho detto finora? In caso contrario, quale sarebbe un caso d'uso legittimo per una classe singleton serializzabile e quale sarebbe la sua semantica?