gpt4 book ai didi

java - 用于序列化单例的 transient

转载 作者:行者123 更新时间:2023-12-02 07:08:26 24 4
gpt4 key购买 nike

Effective Java - 为了维护单例保证,您必须将所有实例字段声明为 transient 并提供“readResolve”方法。通过在这里声明这些字段为 transient 我们可以实现什么目的?这是一个示例:

....
....
public final class MySingleton implements Serializable{
private int state;
private MySingleton() { state =15; }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
public int getState(){return state;}
public void setState(int val){state=val;}
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
public static void main(String[] args) {
MySingleton c = null;
try {
c=MySingleton.getInstance();
c.setState(25);
FileOutputStream fs = new FileOutputStream("testSer.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(c);
os.close();
} catch (Exception e) {
e.printStackTrace();
}

try {
FileInputStream fis = new FileInputStream("testSer.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
c = (MySingleton) ois.readObject();
ois.close();
System.out.println("after deser: contained data is " + c.getState());
} catch (Exception e) {
e.printStackTrace();
}

}
}

无论我是否将“state”变量声明为 transient 变量,我都会将 c.getState() gettign 打印为 25。我在这里错过了什么吗?

最佳答案

通过将属性设置为 transient ,您可以获得的好处是无需序列化状态。序列化它是不必要的,因为它无论如何都会被 readResolve() 方法丢弃。

如果状态由 int 组成,则没有多大关系。但如果状态是对象的复杂图,则会产生显着的性能差异。当然,如果状态不可序列化,您就没有任何其他选择。

也就是说,序列化单例是有问题的。

关于java - 用于序列化单例的 transient ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834809/

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