JAVA - 实现可序列化和可变的单例

问题描述 投票:0回答:1

我目前正在用java开发一个面向对象的系统。我需要为应用程序中的每个对象分配一个唯一的整数标识符,并且能够序列化和反序列化应用程序的整个内容。有人指出单例设计模式是一种存储 java 中“全局变量”等价物的方法,但是 java 中使用 Class 或 Enum 的常见实现分别是不可序列化或不可变的。我将如何制作一个既可变又可序列化的单例?

下面是我编写的 Singleton 类的当前 Java 代码,该类应该是不可序列化的,因为 idCountSingleton 是静态的:

import java.io.Serializable;

public class idCountSingleton extends Serializable{

    private static idCountSingleton INSTANCE;
    private int count;

    private idCountSingleton(id){
        static idCountSingleton INSTANCE;
        private int count = id + 1;
    }

    public int getCount()
        return this.count;

    public idCountSingleton getInstance(){
        return this.INSTANCE;
    }
java oop serialization singleton
1个回答
0
投票

单例不一定是不可变的,单例模式所断言的是整个应用程序中只存在这种对象类型之一。其他想要访问

idCountSingleton
的对象只能使用
getInstance()
方法检索它,而不能自己创建它。

完成班级单例制作:

  1. 确保
    getInstance()
    方法也是静态的,以便其他类可以通过类名访问它(如
    idCountSingleton.getInstance()
  2. 我强烈建议在
    getInstance()
    方法中遵循此模式:
public static synchronized ClassSingleton getInstance() {
    if(INSTANCE == null) {
        INSTANCE = new ClassSingleton();
    }
    return INSTANCE;
}

if-null 检查会延迟构造对象,在创建单例对象之前等待

getInstance()
被调用。方法签名中的
synchronized
关键字确保一次只有一个线程可以进入该方法来额外处理竞争条件(例如,如果两个线程在创建对象之前通过了 if-null 检查,会发生什么?)

然后可以通过使用

getInstance()
访问对象来处理对象的序列化,并且可以在私有构造函数内进行反序列化(假设这是一个单例对象,您可以将其数据保存到固定位置)

© www.soinside.com 2019 - 2024. All rights reserved.