• Java单例类与对象序列化


    Java单例类与对象序列化


    为了保证全局只有一个实例,单例类往往将构造方法的访问权限设置为private:

    public class Singleton implements Serializable{
    
        private static final Singleton SINGLETON = new Singleton(100);
    
        private int value;
    
        private Singleton(int value) {
            // private!
            this.value = value;
        }
    
        public static Singleton getInstance() {
            return SINGLETON;
        }
    }
    

    对单例类进行序列化需要格外小心,下面看一段代码:

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Singleton singleton1 = Singleton.getInstance();
    
            ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("singleton.dat"));
            output.writeObject(singleton1);
    
            ObjectInputStream input = new ObjectInputStream(new FileInputStream("singleton.dat"));
            Singleton singleton2 = (Singleton) input.readObject();
    
            System.out.println("创建新实例:" + (singleton1 != singleton2));
        }
    

    控制台输出:

    创建新实例:true
    

    上面代码的运行结果表明,对单例类进行序列化可能会创建新的实例,即使构造方法是私有的!

    为了解决上述问题,需要定义一种被称为readResolve的特殊序列化方法。如果定义了readResolve方法,在对象序列化时就会调用它。

    public class Singleton implements Serializable {
        private static final Singleton SINGLETON = new Singleton(100);
    
        private int value;
    
        private Singleton(int value) {
            // private!
            this.value = value;
        }
    
        public static Singleton getInstance() {
            return SINGLETON;
        }
    
        protected Object readResolve() throws ObjectStreamException {
            return SINGLETON;
        }
    }
    

    再次执行上面的测试代码,控制台输出如下:

    创建新实例:false
    
  • 相关阅读:
    关于asp.net中Repeater控件的一些应用
    Linux查看程序端口占用情况
    php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用
    给Nginx配置一个自签名的SSL证书
    让你提升命令行效率的 Bash 快捷键 [完整版]
    关系数据库常用SQL语句语法大全
    php 跨域 form提交 2种方法
    Vimium~让您的Chrome起飞
    vim tab设置为4个空格
    CENTOS 搭建SVN服务器(附自动部署到远程WEB)
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/12844461.html
Copyright © 2020-2023  润新知