transient for serializing singleton

后端 未结 3 597
醉酒成梦
醉酒成梦 2020-12-18 17:18

Effective Java - To maintain the singleton guarantee, you have to declare all instance fields transient and provide a \'readResolve\' method. What do we achieve by declaring

相关标签:
3条回答
  • 2020-12-18 17:36
    try {
                c=MySingleton.getInstance();
                c.setState(25);
                FileOutputStream fs = new FileOutputStream("testSer.ser");
                ObjectOutputStream os = new ObjectOutputStream(fs);
                os.writeObject(c);
                os.close();
     }
    

    You are getting 25 because you are setting that value in the object. Refer above code. I think you were expecting the answer to be 15?

    0 讨论(0)
  • 2020-12-18 17:44

    What you gain by making the attribute transient is that you don't serialize the state. Serializing it is unnecessary, since it's discarded anyway by the readResolve() method.

    If the state consists in an int, it doesn't matter much. But if the state is a complex graph of objects, it makes a significant performance difference. And of course, if the state is not serializable, you don't have any other choice.

    That said, serializing a singleton is questionable.

    0 讨论(0)
  • 2020-12-18 17:54

    Irrespective of whether I declare the 'state' variable as transient or not ,I get c.getState() gettign printed out as 25. Am I Missing something here?

    You replace your deserialized object, because readResolve() returns the private static instance of MySingleton, thus overriding the instance returned by the deserialization.

    0 讨论(0)
提交回复
热议问题