Java >> Java tutorial >  >> Tag >> transient

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++;
}

Java tag