Java学习笔记-03用私有构造器大约摆列典范强化Singleton属性[Java编程]
本文“Java学习笔记-03用私有构造器大约摆列典范强化Singleton属性[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于单实例情势,相信很多开辟者并不陌生,但是若何更好更安全的成立单实例对象还是需求一些推敲和考虑的,在Java中主要的成立方法有以下三种,我们辨别作出注释和得当的对比.
1. 将构造函数私有化,直接通过静态公有的final域字段获得单实例对象:
[java] public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elivs() { ... }
public void leaveTheBuilding() { ... }
}
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elivs() { ... }
public void leaveTheBuilding() { ... }
}这样的方法主要上风在于简便高效,利用者很快就可以断定当前类为单实例类,在调用时直接操作Elivs.INSTANCE便可,由于没有函数的调用,因此效率也非常高效.但是事物是具有一定的双面性的,这种计划方法在一个方向上走的过于极度了,因此他的缺陷也会是十清楚显的.假如此后Elvis的利用代码被迁移到多线程的利用环境下了,系统但愿可以做到每个线程利用同一个Elvis实例,差别线程之间则利用差别的对象实例.那么这种成立方法将无法实现该需求,因此需求改正接口以及接口的调用者代码,这样就带来了更高的改正本钱.
2. 通过公有域成员的方法返回单实例对象:
[java] public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elivs() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elivs() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
这种办法很好的补偿了第一种方法的缺陷,假如此后需求适应多线程环境的对象成立逻辑,仅需求改正Elvis的getInstance()办法内部便可,对用调用者而言则是不变的,这样便极大的缩小了影响的范围.至于效率问题,当今的JVM针对该种函数都做了很好的内联优化,因此不会产生因函数频繁调用而带来的开销.
3. 利用列举的方法(Java SE5):
[java] public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}就目前而言,这种办法在功效上和公有域方法相近,但是他越发简便越发清楚,扩大性更强也越发安全.
摘自 horsttnann的专栏
以上是“Java学习笔记-03用私有构造器大约摆列典范强化Singleton属性[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |