gpt4 book ai didi

Java - 为什么 transient 成员变量在 Java 标准库中使用如此广泛?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:08 24 4
gpt4 key购买 nike

看了一些Java Collection类的源码,发现成员变量总是被transient修改。

例如LinkedList源代码:

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;

public LinkedList()
{
header.next = header.previous = header;
}

public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}

// ...other stuff
}

当然,不仅LinkedList使用transient,几乎每个Java集合类都使用transient来修饰至少一半的成员变量。

那么,我的问题是:为什么 transient 在 Java 标准库中使用如此广泛

(当然大家都知道transient的定义和用法,但这不是我的问题:)

最佳答案

从序列化的角度序列化整个对象时不会序列化 transient 变量。

当你不希望某些变量被序列化时,你可以将其设为 transient

从您的示例来看,LinkedList 是可序列化的。如果仔细观察,所有变为 transient 的变量都是以编程方式维护的。所以没有必要坚持他们。

例如size ,当您读回任何序列化对象时,您正在阅读的只是 Node<E>并以编程方式维护大小。所以不需要序列化 ​​size .记住一个LinkedList的真实数据不是它的size .如果您有真实数据,即 entries您可以随时计算它的大小,而且这样更容易。

供引用,请查看。

@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 - 为什么 transient 成员变量在 Java 标准库中使用如此广泛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com