readResolve()的使用

对于一些singleton class,如果你让其implements Serializable,会导致该class不再是singleton。使用ObjectInputStream.readObject()读取进来之后,如果是多次读取,就会创建多个object,下面的代码可以证明这一点,解决的办法之一就是override一个 method,readResolve()

 1 package foo;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.io.Serializable;
 8 
 9 // Singleton Box:
10 class Box implements Serializable {
11     private static Box instance = new Box("TEST");
12     public static Box getInstance() {
13         return Box.instance;
14     }
15     private Box(String name) {  
16         this.name = name;
17     }
18     private String name;
19     @Override
20     public String toString() {
21         return "Box " + name;
22     }
23     
24     /* ********************************
25     private Object readResolve(    ) {
26         return Box.getInstance();
27     }
28     * ********************************/
29 }
30 
31 public class Foo {
32     public static void main(String[] args) {
33         Box box = Box.getInstance();
34         System.out.println(box.toString());   
35         try {   
36            ObjectOutputStream o = new ObjectOutputStream(   
37                         new FileOutputStream("e:/box.out"));   
38            o.writeObject(box);   
39            o.close();   
40         } catch(Exception e) {
41             e.printStackTrace();
42         }
43         
44         Box box1 = null, box2 = null;
45         
46         try {   
47            ObjectInputStream in =new ObjectInputStream(   
48                         new FileInputStream("e:/box.out"));
49            box1 = (Box)in.readObject();   
50            in.close();
51         } catch(Exception e) {
52             e.printStackTrace();
53         }
54         
55         try {   
56            ObjectInputStream in =new ObjectInputStream(   
57                         new FileInputStream("e:/box.out"));
58            box2 = (Box)in.readObject();   
59            in.close();
60         } catch(Exception e) {
61             e.printStackTrace();
62         }
63         
64         System.out.println("box1.equals(box2) : " + box1.equals(box2));
65         System.out.println(box1);
66         System.out.println(box2);  
67     }
68 }
原文地址:https://www.cnblogs.com/qrlozte/p/3137412.html