Un singleton serializzabile implica contemporaneamente sia la semantica di valore che di riferimento?

3

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 and BigInteger should implement Serializable, as should most collection classes. Classes representing active entities, such as thread pools, should rarely implement Serializable.

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?

    
posta Ixrec 20.06.2015 - 15:27
fonte

2 risposte

1

Se si sta facendo il logging, sarebbe spesso conveniente registrare lo stato di tutti i singleton, poiché rappresentano lo stato globale che potrebbe essere richiesto per riprodurre un arresto anomalo. Se il tuo singleton può essere registrato serializzando una rappresentazione completa di se stesso, questo è l'ideale in quanto potresti anche deserializzare quello stato ed eseguire nuovamente il programma con il singleton nello stesso stato.

tl; dr, riproducibilità.

Modifica: non volevo entrare troppo nel rapporto tra la semantica Value e Reference, perché non sono un ragazzo Java e sembra che i libri che stai dicendo comprendano queste cose in un modo più specifico che probabilmente ha perfettamente senso in Java, quindi non so che dovrei contraddirli o tu.

Tuttavia, darò due centesimi su questo. La semantica del valore e di riferimento (per me) generalmente si riferisce a ciò che accade quando copi qualcosa: copi i valori (e hai un oggetto nuovo, genuino, originale), o copi un riferimento (quindi hai un nuovo riferimento al stessa cosa). Tuttavia, il punto principale di Singletons è che non sono affatto copiabili. Quindi, nella mia mente, non penserei davvero che Singleton abbia o la semantica.

Ora, in C ++, questo è un po 'più chiaro: generalmente in C ++ quando si ha un singleton, non si può ottenere l'oggetto singleton "effettivo", solo un riferimento ad esso. E il riferimento, naturalmente, ha una semantica di riferimento, che non dice nulla sulla semantica del singleton, che è ok, perché non si può accedere al singleton reale. In Java però, questo è molto più sfocato perché generalmente si manipolano tutti gli oggetti per riferimento. Quindi sembra che un singleton si stia comportando come qualsiasi altro oggetto di riferimento.

    
risposta data 20.06.2015 - 18:36
fonte
0

"Essere serializzabili implica necessariamente semantica del valore" - non del tutto. Dopo che un oggetto con semantica di riferimento è serializzato, ha assolutamente senso creare un altro oggetto che corrisponda alla rappresentazione serializzata, o mutare un oggetto mutabile con la semantica di riferimento in modo che corrisponda alla rappresentazione serializzata.

Di solito considero il punto di vista che un singleton non ha uno stato persistente, ma spesso dà accesso a qualche tipo di stato persistente. Lo stato permanente potrebbe trovarsi su un server, eventualmente accessibile da altre istanze dell'applicazione, oppure potrebbe essere memorizzato localmente. Se è memorizzato localmente, potrebbe essere considerato parte del singleton e potrebbe essere memorizzato tramite la serializzazione.

In quel caso, in un punto in cui sarebbe stato creato il singleton, potrebbe essere creato deserializzando un singleton serializzato in precedenza o creandolo da zero se prima non era mai serializzato.

    
risposta data 10.12.2016 - 17:17
fonte

Leggi altre domande sui tag