Java - hvorfor forbigående medlemsvariabler brugt så udbredt i Java-standardbiblioteket?
Fra serialiseringssynspunkt vil transiente variable ikke serialiseres, når hele objektet serialiseres.
Når du ikke ønsker at en variabel skal serialiseres, gør du den forbigående
Fra dit eksempel kan LinkedList serialiseres. Hvis du ser grundigt efter, bliver alle variabler, der er lavet forbigående, vedligeholdt programmatisk. SÅ der er ingen grund til at blive ved med dem.
For eksempel size
, når du læser ethvert serialiseret objekt tilbage, læser du kun Node<E>
og vedligeholde størrelsen programmatisk. Så der er ingen grund til at serialisere size
. Husk de rigtige data for en LinkedList
er ikke dens size
. Hvis du har de rigtige data, som er entries
du kan beregne dens størrelse til enhver tid og det er nemmere på denne måde.
For reference, tag et kig.
@SuppressWarnings("unchecked")
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in any hidden serialization magic
s.defaultReadObject();
// Read in size
int size = s.readInt();
// Read in all elements in the proper order.
for (int i = 0; i < size; i++)
linkLast((E)s.readObject());
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}