36
|
frictionlesspulley sameer · 技术社区 · 14 年前 |
![]() |
1
35
最好的方法是使用枚举单例模式:
这保证了对象的单一性,并为您提供可序列化性,使您始终获得相同的实例。
一般来说,您可以提供
|
![]() |
2
27
@科林德是对的,但他的回答也说明了为什么单子并没有真正的系列化。 下面是序列化枚举值时发生的情况(请参见 here )
因此,附加到枚举值的任何其他状态都不会在序列化和反序列化之后继续存在。
通过将自定义序列化/反序列化代码添加到singleton类中,您可以自己做同样的事情。该代码要么根本不记录单例的状态,要么在反序列化单例时丢弃它。不管怎样,你都要把逻辑放到
现在,我假定您想要序列化单例的原因是您想要保持它们的状态。不幸的是,这提出了一个概念上的问题。假设您的应用程序已经在正常的事件过程中实例化了singleton,然后它反序列化了一些对象图,其中包括singleton的前一个实例的副本。它能做什么?
|
![]() |
3
5
使用Enum的解决方案不能与由Spring、EJB、Guice或任何其他DI框架管理的单例程序一起工作。它只适用于枚举,因为枚举是由序列化算法专门处理的。 首先, 单例不需要序列化 ,因为如果反序列化它,然后反序列化单例!=yoursingleton.getInstance(),这意味着您的singleton有两个实例,这意味着您的singleton根本不是singleton,这可能导致不可预知的错误。 但是,有时需要序列化包含对singleton引用的非singleton。解决方案很简单:
带弹簧:
|
![]() |
4
4
下面是我的
下面是将首先序列化然后反序列化上述类的类。这里反序列化发生了两次,但由于readresolve()方法,两次都只创建一个实例。
输出为:
已保存序列化数据
结论:
singleton类也可以通过保留
|
![]() |
5
1
这可能是一个熟悉的解决方案,但以防万一。
测试代码
产量
|
![]() |
6
1
假设我们有以下单例类:
现在我们有了下面这样的主要类来序列化和反序列化对象:
因此,如果我们执行上述代码,我们将得到以下行为: “例如,它创建了两个对象和一个静态引用。这意味着,如果我们多次读取单个对象的序列化格式,我们将创建多个对象。这不是单例对象应该做的。那么我们能避开我吗?是的,我们可以。” 为了避免singleton类的多个实例,我们将使用序列化提供的以下方法:
这将阻止创建单个类的多个实例。 |
![]() |
7
0
我认为单例可以序列化,下面是关于如何进行的代码:
下面是“main”方法,它获取上面的singleton类的实例,对其进行序列化和反序列化:
输出是:
谢谢。 |
|
8
0
下面是打破singleton类的答案,以及如何使用readresolve()方法防止类创建不同的对象; 导入java.io.serializable; 公共类singleton实现可序列化{
} 公共类breaksingletonusingserialization{
} |
![]() |
9
-1
单例类就像一个管理器或控制器,一般来说,我们不希望保存任何控制器的状态,而不是实体的状态。一般来说,我们需要保存任何实体的对象状态,而不是控制器。
|
![]() |
S qasem · Android内存性能 6 年前 |
![]() |
R83nLK82 · 在单例设计模式上引发IOException 6 年前 |
![]() |
hal · 两个课程有什么区别?他们的工作方式不同吗? 6 年前 |
![]() |
Jaquarh · 如何在不使用DI的情况下实例化父类 6 年前 |
|
Deepanshu · 基于PHP的Web应用程序中的单例对象状态 6 年前 |
![]() |
dicle · 视图控制器中的依赖项注入 6 年前 |
![]() |
Kozuki · 如何在生产代码中考虑单例? 7 年前 |