关于"如何破坏单例"我说了好几种方式
|
如上,通过发射的方式即可获取到一个新的单例对象,这就破坏了单例。 Q:那这种破坏单例的情况,有办法避免吗? A:其实是可以的,只要我们在构造函数中加一些判断就行了。
如下方式,我们在Singleton的构造函数中增加如下代码: 列化破坏单例 Q:嗯嗯,挺不错的,那我们换个问题吧。 A:(这部分面试官在犹豫问我什么问题,我主动提醒了他一句)其实,除了反射可以破坏单例,还有一种其他方式也可以的。 Q:嗯,那你就说说还有什么方式吧 A:其实通过序列化+反序列化的方式也是可以破坏单例的。
如以下代码,我们通过先将单例对象序列化后保存到临时文件中,然后再从临时文件中反序列化出来: 如上,通过先序列化再反序列化的方式,可获取到一个新的单例对象,这就破坏了单例。 因为在对象反序列化的过程中,序列化会通过反射调用无参数的构造方法创建一个新的对象,所以,通过反序列化也能破坏单例。 Q:那这种破坏单例的情况,也同样有办法避免吗? A:当然也有了。只要修改下反序列化策略就好了。
只需要在Sinleton中增加readResolve方法,并在该方法中指定要返回的对象的生成策略几可以了。即序列化在Singleton类中增加以下代码即可: (编辑:南昌站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


