
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习Java编程开发等互联网编程语言,而本文我们就通过案例分析来简单了解一下,单例模式创建实例的方式有哪些。
在Java语言里面,有这几种方式:new关键字、clone方法克隆、反序列化、反射。
new关键字
如果要保证一个类是单例,则必须阻止用户通过new关键字来随意创建对象,简单粗暴的方法就是将构造方法私有化,然后提供一个静态方法来进行实例的外部访问。
clone方法克隆
clone方法是原型模式中创建复杂对象的方法,在Java中,clone方法是Object基类的方法,因此所有的类都会继承该方法,但只有实现了Cloneable接口的类才能正常调用clone方法克隆对象实例,否则会抛出类型为CloneNotSupportedException的异常,单例的类要防止用户通过clone方法克隆就不能实现Cloneable接口。
反序列化
在Java里面,实现了Serializable接口的类可以通过ObjectOutputStream将其实例序列化,然后再通过ObjectInputStream进行反序列化,而在默认情况下,反序列之后得到的是一个新的实例,这就违背了单例的法则了。
反射
聪明的你也许注意到了,上面的readResolve方法是private的。那么它是怎么被调用的呢?答案就是通过反射,想了解更详细的调用过程可以去看看ObjectInputStream类源码中的readOrdinaryObject方法。
通过反射可以无视private修饰符的限制调用类里面的各种方法,也就是说用户可以利用反射来调用我们的私有构造方法
单例模式实践影响
不能显式继承
和常规类一样,枚举可以实现接口,并提供公共实现或每个枚举值的单独实现,但不能继承,因为所有的枚举默认隐式继承了Enum类型,不能继承也就意味着丧失了一部分的抽象能力(不能定义abstract方法),虽然可以通过组合的方式变通实现,但这无疑牺牲了扩展性和灵活性。
无法延迟加载
因为枚举实例化的特殊性,所有的构造器属性都必须在枚举创建时指定,无法在运行时通过代码动态传递和构造。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。