zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    【有感】向香港雷锋学什么
    After NeuSoft’s Interview
    【SHELL学习】if语句
    《我是一只IT小小鸟》【1】
    MSDN微软社区 大连线下聚会 即将举行
    【毕业设计】修改用户信息
    SQL Connection
    EasyPR中文开源车牌识别系统 开发详解(1)
    EasyPR开发详解(2)车牌定位
    EasyPR开发详解(4)形态学操作、尺寸验证、旋转等操作
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3137412.html
Copyright © 2011-2022 走看看