推荐阅读:单例模式的 8 种写法,非常全!

使用反射技术来获取不同的实例,以下是一个简单的饿汉式的单例模式的代码实现:

当我们需要获取Singleton对象的时候,直接调用静态方法getInstance就可以了:

但是学过反射的人都知道,通过反射技术也能获取到一个类的实例对象,即使它的构造函数时私有化的,我们也可以通过暴力访问来调用其构造函数,所以以上测试类的运行结果为:

可以看出通过调用getInstance方法获取到的实例是一样的,但是通过反射获取到的实例却是不同的,违反了单例设计模式的思想,那么我们应该怎么解决呢?我们只需要在私有的构造函数中加入一个判断即可:

此时,我们再次启动测试类,获得到以下结果:

当然,就解决了使用反射技术来获取不同实例的问题了。

使用序列化及反序列化技术获取不同的实例:

如果我们的单例类实现了Serializable接口,那么这个类就能进行序列化和反序列化,测试代码如下:

运行结果如下:

我们发现进过序列化及反序列化之后对象的引用就改变了,显然也是违反了单例设计模式的思想的,跟踪readObject源码后,发现这个方法会先写出一个newInstance,然后判断这个对象中是否存在readResolve这个方法,如果不存在,那么直接返回这个newInstance,如果存在,那么就调用readResolve这个方法,将这个方法的返回值返回给readObject.源码片段如下:

由上可知,我们只需要在Singleton这个类中添加一个readResolve这个方法即可。

再次启用测试类,运行结果如下:

来源:https://my.oschina.net/u/3441184/blog/884767

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注