首页
学习
活动
专区
工具
TVP
发布

java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解

这种情况我们可以使用readResolve方法来防止。 private Object readResolve(){.....} ...ObjectInputStream 会检查对象的class是否定义了readResolve方法。如果定义了,将由readResolve方法指定返回的对象。...因为我们有定义readResolve()方法,desc通过invokeReadResolve(Object obj)方法调用readResolve()方法获取单例对象instance,将他赋值给rep...6.第一次实例化完成后,通过反射寻找该单例类中的readResolve()方法,没有则直接返回obj对象。这就是我们对没有readResolve()方法的类进行序列化后生成不同对象的原因。...7.因为我们有定义readResolve()方法,desc通过invokeReadResolve(Object obj)方法调用readResolve()方法获取单例对象instance,将他赋值给rep

55730
您找到你想要的搜索结果了吗?
是的
没有找到

Effective-java-读书笔记之序列化

如果单例模式的类加上了implements Serializable, 就多了一种创建实例的途径.readResolve特性允许你用readObject创建的实例代替另一个实例....对于一个正在被反序列化的对象, 如果它的类定义了一个readResolve方法, 并且具备正确的声明, 那么在反序列化之后, 新建对象上的readResolve方法就会被调用....在这个特性的绝大多数用法中, 指向新建对象的引用不需要再被保留, 因此立即成为垃圾回收的对象.可以利用readResolve方法保证单例模式. -> 方法忽略被反序列化的对象, 只返回该类初始化时创建好的那个实例....如果依赖readResolve进行实例控制, 带有对象引用类型的所有实例域都必须声明为transient的.从历史上来看, readResolve方法被用于所有可序列化的实例受控(instance-controlled...在外围类中添加writeReplace方法. -> 产生代理类实例.外围类中添加readObject方法. -> 防止伪造.代理类中提供readResolve方法, 返回一个逻辑上相当的外围类的实例.

29950

【设计模式】之单例模式

readResolve()方法 在Java规范中有关于readResolve()方法的介绍: 对于可序列化的和外部化的类,readResolve() 方法允许一个类可以替换/解析从流中读取到的对象。...通过实现 readResolve 方法,一个类就可以直接控制反序列化后的实例以及类型。...定义如下: ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException; readResolve 方法会在...ObjectInputStream 会检测类是否定义了 readResolve 方法。 如果 readResolve 方法定义了,会调用该方法用于指定从流中反序列化后作为返回的结果对象。...所以我们可以覆盖 readResolve 方法来解决序列化破坏单例的问题: 类 SingletonZCloneSerializableReadResolve 增加 readResolve 方法: /**

24710

当Kotlin邂逅设计模式之单例模式(一)

object KSingleton : Serializable {//实现Serializable序列化接口,通过私有、被实例化的readResolve方法控制反序列化 fun doSomething...() { println("do some thing") } private fun readResolve(): Any {//防止单例对象在反序列化时重新生成对象...return KSingleton//由于反序列化时会调用readResolve这个钩子方法,只需要把当前的KSingleton对象返回而不是去创建一个新的对象 } } //...() { return INSTANCE;//可以看到readResolve方法直接返回了INSTANCE而不是创建新的实例 } static {//静态代码块初始化KSingleton...然而为了让开发者能够控制反序列化,提供一个特殊的钩子方法那就是readResolve方法,这样一来我们只需要在readResolve直接返回原来的实例即可,就不会创建新的对象。

90030

Java单例---序列化破坏单例模式原理解析

= null); } 可以看到这是一个反射有关的方法,作用是:如果表示的类是实现了serializable/externalizable的,并定义一个符合的readResolve方法则返回true,否则...那么可能有人会有疑问,为什么这个方法名字是readResolve(),而不是其他的呢?...", null, Object.class); 这个代码中就规定了“readResolve”方法的名字,然后上面那个反射方法就是readResolveMethod.invoke(obj, (Object...所以方法名字就是“readResolve”。...那么在反射中调用了我们在单例中定义的“readResolve”方法,这个方法返回了我们已经创建的单例实例,所以读取的类就成了我们在单例中创建的类,而不是上面三目运算创建的新的实例。 好了!

12320

面试官看完我手写的单例直接惊呆了!

readResolve 为什么可以解决序列化破坏单例的问题? 我们通过查看源码中一些关键的步骤,就可以解决心中的疑惑。 我们思考一下,序列化和反序列化的过程中,哪个流程最有可能有操作空间。...发现它最后就是为了返回我们添加的readResolve 方法。 ?...此方法,是通过反射调用 readResolve方法,得到了 rep 对象。 ? ? 然后,判断 rep 是否和 obj 相等 。...obj 是刚才我们通过构造函数创建出来的新对象,而由于我们重写了 readResolve 方法,直接返回了单例对象,因此 rep 就是原来的单例对象,和 obj 不相等。...一句话总结就是:当从对象流 ObjectInputStream 中读取对象时,会检查对象的类否定义了 readResolve 方法。

68330

单例模式谁都会,破坏单例模式听说过吗?

现在我们在 Singleton 类中实现一个 readResolve 方法,该方法直接返回了这个单例对象: 重新执行下,发现结果为 true!...具体是什么原理,我们来看看刚才的 readOrdinaryObject 方法: 可以看到,在条件判断中 desc.hasReadResolveMethod() 会判断类是否有 readResolve(...所以,如果想要防止单例被反序列化破坏,就让单例类实现 readResolve() 方法 反射破坏单例 上面说到,反序列化底层其实就是通过反射来创建一个新对象的,我们直接来看反射是怎么破坏单例的:...总结下,如果今后需要自己手动实现一个单例的话,可以选择【构造函数判断】+【实现 readResolve() 方法】的方式 来防止单例被破坏 优雅的单例实现:Enum 那如果我不想在构造函数里面做判断,也不想写...readResolve() 方法,我就想安安静静写个单例,有没有更简单更优雅的方法?

84310
领券