1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
public class Layer implements Serializable, Cloneable {
private static final long serialVersionUID = 7526471155622776147L;
// l'objet qui va servir de sauvegarde de Dimension.
static private Layer singleton = null;
private String name;
private transient Dimension dim;
.. getters et setters
.
// le getter du singleton Layer
static public synchronized Layer getSingleton() {
if (singleton == null) {
singleton = new Layer();
}
return singleton;
}
private void writeObject(ObjectOutputStream out) throws IOException {
// calling the default serialization.
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// calling the default deserialization.
in.defaultReadObject();
}
Object writeReplace() throws ObjectStreamException, CloneNotSupportedException {
//je récupère l'objet Dimension qui à cet instant n'est pas null. et je le clone pour avoir une instance différente à coup sûr.
Dimension dim_ = (Dimension) getDimension().clone();
//ici le singleton a pour valeur null à tous ses attributs.
Layer tmp = (Layer) getSingleton().clone();
//je lui affecte le Dimension courant pour que ce singleton aura seulement un attribut non null qui vaut donc le singleton courant.
tmp.setDimension(dim_);
Layer l = this;
//je renvoi l'instance courante de Layer car je sérialise Layer
return l;
}
Object readResolve() throws ObjectStreamException {
//je récupère l'instance courante qui à ce momment la tout les attributs sont rempli sauf le Dimension qui est null, cad tous les attributs non transient sont la.
Layer l = this;
//je récupère le Dimension qui a été affecté au singleton dans le writeReplace()
Dimension dim_ = getSingleton().clone().getDimension();
// j'affecte au Layer récupérer le Dimension qui reste à remplir
l.setDimension(dim_);
reutrn l; //et enfin je renvoi le tout
}
} |
Partager