我目前正在用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;
}
单例不一定是不可变的,单例模式所断言的是整个应用程序中只存在这种对象类型之一。其他想要访问
idCountSingleton
的对象只能使用 getInstance()
方法检索它,而不能自己创建它。
完成班级单例制作:
getInstance()
方法也是静态的,以便其他类可以通过类名访问它(如idCountSingleton.getInstance()
)getInstance()
方法中遵循此模式:public static synchronized ClassSingleton getInstance() {
if(INSTANCE == null) {
INSTANCE = new ClassSingleton();
}
return INSTANCE;
}
if-null 检查会延迟构造对象,在创建单例对象之前等待
getInstance()
被调用。方法签名中的 synchronized
关键字确保一次只有一个线程可以进入该方法来额外处理竞争条件(例如,如果两个线程在创建对象之前通过了 if-null 检查,会发生什么?)
然后可以通过使用
getInstance()
访问对象来处理对象的序列化,并且可以在私有构造函数内进行反序列化(假设这是一个单例对象,您可以将其数据保存到固定位置)