序列化对单例模式和枚举类型安全的影响:
A.在枚举类型加入Java之前,往往采用以下的代码:
public class Orientation{
private static final Orientation HORIZONTAL=new Orientation(1);
private static final Orientation VERTICAL=new Orientation(2);
private Orientation(int v){ value=v; }//*注意单例模式中构造器为私有
private int value;
}
单例模式的私有构造器决定,除了Orientation.HORIZONTAL或Orientation.VERTICAL,不能创建对象.可以用==测试两个对象:
if(orientation==Orientation.HORIZONTAL) ...
但这种情况在实现序列化接口时会发生错误,当你序列化Orientation.HORIZONTAL或Orientation.VERTICAL,再反序列化出来时,会在内存中产生一个新的对象,导致以下比较错误:
if(saved==Orientation.HORIZONTAL) ...
即使是私有构造器,序列化机制依然能创建一个新的对象.
解决方案:增加readReslove方法,该方法会在反序列化时调用,且返回一个对象,这个对象就是readObject返回的对象:
public Object readObejct() throws ObjectStreamException{
if(value==1) return Orientation.HORIZONTAL;
if(value==2) return Orientation.VERTICAL;
return null;//这通常不发生
}
分享到:
相关推荐
静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,我们可以创建一个名为SingletonFactory的工厂类,其中包含一个...
在Java中实现单例模式有多种方法: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种实现方式无法实现延迟加载。 ```java public class Singleton { private static final ...
以上就是Java中实现单例模式的常见方法,每种方式都有其适用场景和优缺点。在实际开发中,我们需要根据项目需求选择合适的方式实现单例。同时,理解单例模式背后的原理和应用场景,有助于提升代码的设计质量。
下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...
Java单例模式是一种设计模式,它允许...以上就是关于Java单例模式的深入理解和常见实现方式,希望对你理解单例模式有所帮助。在实际开发中,灵活运用并结合具体场景选择合适的单例模式将有助于提高代码质量和可维护性。
利用类加载机制保证线程安全,同时避免了同步方法带来的性能影响。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton ...
实现单例模式,Java中有几种常见的方法: 1. 饿汉式(静态常量):这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final ...
在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 `...
特别是在现代软件开发中,考虑到多线程环境、类加载机制以及序列化等因素的影响,合理地设计和实现单例模式变得尤为重要。通过上述讨论,我们可以看到单例模式在不同场景下的适用性及其潜在问题,并学习到了相应的...
同时,枚举避免了序列化导致的多实例问题。 以上就是关于单例模式的一些核心概念和常见实现方式。在实际开发中,根据需求和场景选择合适的实现方式至关重要,以平衡性能和资源使用。同时,需要注意的是,过度依赖...
4. **静态内部类**:利用JVM的类加载机制保证单例,既延迟初始化,又避免了同步,但是会涉及反射和序列化的问题。 ```java public class Singleton { private Singleton() {} private static class ...
下面我们将详细介绍六种常见的单例模式,并探讨在Android环境下如何应对反序列化安全问题。 1. 饿汉式单例(Static Singleton) 这是最简单的单例实现方式,通过静态常量来存储唯一实例,保证在类加载时就完成初始...
单例模式是软件设计模式中的一种,它的主要...在实际应用中,还需要考虑JVM的垃圾回收机制、序列化以及测试等方面的问题,以确保单例模式的正确性和健壮性。理解并熟练运用单例模式,有助于提高代码的可维护性和效率。
在Java中实现单例模式有多种方法,每种方法都有其特点和适用场景。本文将详细介绍几种常见的单例模式实现方式,并探讨它们在实际开发中的应用和最佳实践。 在实现单例模式时,应注意以下几点: 确保单例类不被继承...
这是Joshua Bloch在《Effective Java》中推荐的方式,既简单又线程安全,无需担心序列化问题。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 以上就是Java中实现单例模式...
使用枚举类型也可以实现单例模式,这是Java语言提供的原生态支持,不仅能自动支持序列化机制,而且绝对防止多次实例化。代码示例如下: ```java public enum Singleton { INSTANCE; public void someMethod()...
7. **枚举**:这是Joshua Bloch在《Effective Java》中推荐的方式,既简单又线程安全,同时也防止反序列化创建新实例。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` ###...
确保单例模式正确实现的关键在于防止多线程环境下的多次实例化和序列化/反序列化时的多次创建。 **2. 工厂模式** 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。通过创建一个工厂类,可以根据...