如何在ActFramework中创建单例
Java中创建单例是一个有趣的话题 人们对此进行了很多讨论.
常规方法
自从有了Java 5之后创建单例就变得及其简单了:
public enum MySingleton {
INSTANCE;
// your class implementation starts here
public String foo() {
return "foo"
}
}
引用单例的方法:
String s = MySingleton.INSTANCE.foo();
如果你的单例需要继承其他类,你就不能使用enum
方式。这个时候你可以使用老方法:
public class MySingleton extends MyBaseClass {
public static final MySingleton INSTANCE = new MySingleton();
}
如果希望INSTANCE私有的话:
public class MySingleton extends MyBaseClass {
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton instance() {
return INSTANCE;
}
public String foo() {
return "foo"
}
}
或者说你希望延迟加载的话:
public class MySingleton extends MyBaseClass {
private static volatile final MySingleton INSTANCE;
public static MySingleton instance() {
if (null == INSTANCE) {
synchronized(MySingleton.class) {
if (null == INSTANCE) {
INSTANCE = new MySingleton();
}
}
}
return INSTANCE;
}
}
提示 你需要在INSTANCE
申明上引入volatile
关键字,否则就会落入双锁检查陷阱
ActFramework特别支持
在ActFramework你还有一种简单的使用单例模式的办法,在类申明上加入javax.inject.Singleton
注解:
@javax.inject.Singleton
public class MySingleton extends MyBaseClass {
public String foo() {
return "foo"
}
}
使用单例对象:
String s = act.app.App.instance().singleton(MySingleton.class).foo();
如果你的类不需要继承其他类的话你也可以考虑直接继承act.util.SingletonBase
:
public class MySingleton extends act.util.SingletonBase {
public String foo() {
return "foo"
}
}
这个方法和javax.inject.Singleton
注解效果是一样的,而且引用单例对象变得更加简单:
MySingleton singleton = MySingleton.instance();
String s = singleton.foo();
// you can also use the App.singleton(Class) way to fetch your singleton:
MySingleton singleton2 = act.app.App.instance().singleton(MySingleton.class);
// or you can just ask App to give you an new instance:
MySingleton singleton3 = act.app.App.instance().getInstance(MySingleton.class);
上面的代码中,ActFramework确保singleton
, singleton2
和 singleton3
都指向同一个实例。你还可以把单例注入到其他类中:
public class MySingletonConsumer {
@Inject
private MySingleton mySingleton;
}
或者注入到你的响应器方法中:
@GetAction("/foo")
public String sayFoo(MySingleton mySingleton) {
return mySingleton.foo();
}
总结
- 创建单例最简明的方法是把你的类申明为
enum
- ActFramework识别
javax.inject.Singleton
注解并自动加载单例实例到内存。应用程序可以使用act.app.App.instance().singleton(Class)
调用来获取单例 - ActFramework实现了单例注入
- ActFramework提供
SingletonBase
类。如果应用类继承了SingletonBase
,单例可以通过MySingleton.instance()
调用来获取
当前内容版权归 actframework.org 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 actframework.org .