@SuppressWarnings("serial")
public class OnlySingleton implements Serializable {
private static OnlySingleton singleton = new OnlySingleton();
private OnlySingleton() {}
public static OnlySingleton getInstance() {
return singleton;
}
/**
* 反序列化时内存Hook这段代码
* @return
*/
private Object readResolve() {
return singleton;
}
}
public class SingletonSerializableTest {
@Test
public void testSingletonSerializable() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
OnlySingleton singleton = OnlySingleton.getInstance();
oos.writeObject(singleton);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
OnlySingleton clone = (OnlySingleton) ois.readObject();
System.out.println(singleton);
System.out.println(clone);
}
}
分享到:
相关推荐
可以通过实现Serializable接口并重写readResolve()方法来解决这个问题。 此外,Singleton模式虽然简单易用,但也有一些缺点,如违背了开闭原则(对扩展开放,对修改关闭),导致程序难以进行单元测试,以及在某些多...
2. **序列化**:如果单例类实现了`Serializable`接口,需要处理反序列化时可能创建新实例的问题,通常在`readResolve()`方法中返回现有实例。 3. **懒汉式与饿汉式**:懒汉式(延迟初始化)在类加载时不创建实例,...
7. **序列化与反序列化**: 如果单例实现了`Serializable`接口,那么在反序列化时会创建新的实例。为了解决这个问题,可以添加`readResolve()`方法: ```java public class Singleton implements Serializable { ...
在实际开发中,我们还需要考虑反序列化和反射攻击破坏单例的情况,通常会在构造函数上添加`private`修饰符并使用`readResolve()`方法或`equals()`和`hashCode()`方法来防止这种情况发生。 总结起来,Java单例模式的...
3. 考虑到反序列化和反射攻击,使用枚举类型或添加私有构造函数和`readResolve()`方法可以防止非法创建多个实例。 4. 在多线程环境下,必须确保单例的线程安全性。 通过这个"Singleton.zip"文件,你可以学习到如何...
为了防止这种情况,我们需要在Singleton类中实现`readResolve()`方法: ```java import java.io.ObjectStreamException; public class Singleton implements Serializable { // ... protected Object ...
单例模式是软件设计模式中的一种...此外,注意在设计时考虑反序列化或反射攻击,可以使用`readResolve()`或`clone()`方法来避免创建额外的实例。学习并理解这些单例模式,对于提高代码质量,减少资源浪费具有重要意义。
private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **懒汉式单例(线程不安全)**: 实例在首次...
与静态常量类似,但在类加载时初始化,线程安全,但可能导致资源浪费。 ```java public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton...
1. **防止反序列化创建新实例**:默认情况下,Java序列化会破坏单例,可以通过实现 `readResolve()` 方法来解决这个问题。 2. **线程安全**:确保在多线程环境下,单例的实例化过程是线程安全的。 3. **懒加载与初始...
需要注意的是,当单例模式与序列化结合时,如果不做特殊处理,反序列化可能会创建新的实例,破坏单例的特性。可以通过实现readResolve()方法来解决这个问题。 在实际开发中,除了了解如何实现单例,还需要考虑何时...
另外,使用不同类加载器加载同一类会导致多个单例存在,而序列化和反序列化也可能破坏单例,除非正确处理readResolve()或writeReplace()方法。 总之,单例模式是一种强大的设计模式,但使用时需谨慎,特别是在多...
private static final StaticSingleton INSTANCE = new StaticSingleton(); private StaticSingleton() {} public static StaticSingleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式单例(Lazy...
对象序列化之后再反序列化时会生成新的对象,因此当 Singleton 单类模式类实现序列化接口时,必须显式声明所有的字段为 transient,并且提供 readResolve 方法来防止通过序列化破坏单态模式。 除了饱汉模式和饿汉...
因为单例类通常与具体业务紧密耦合,添加新功能时可能需要修改单例类。 总的来说,单例模式是一种实用的设计模式,但在使用时应谨慎考虑其适用场景,避免滥用。在多线程和并发环境下,需特别注意线程安全问题。同时...
### 单例设计模式概述与实现方式 单例设计模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在多种编程语言中都有应用,尤其适用于资源消耗较大的对象或者需要频繁访问共享...
为此,可以在单例类中添加`readResolve()`方法来返回唯一的实例。 总的来说,Java的单例设计模式是一种强大的工具,可以帮助我们有效地管理全局资源,提高系统的效率和稳定性。正确理解和使用单例模式,对于提升...
- 考虑到序列化和反序列化可能导致单例模式失效,可以重写`readResolve()`方法来解决这个问题。 总的来说,单例模式是一种有效的设计模式,能够有效地管理资源和提供全局访问点,但在使用时需要注意线程安全以及...
1. **序列化与反序列化**:如果单例类实现了`Serializable`接口,那么在反序列化时会生成新的实例。为了避免这种情况,我们需要在单例类中添加`readResolve()`方法。 2. **反射攻击**:通过反射调用私有构造函数也...