我在stackoverflow上阅读了很多关于使用enum创建单例类的知识。 我一定错过了一些东西,因为我无法在任何地方到达实验室。
这是我的代码:
public class UserActivity {
private DataSource _dataSource;
private JdbcTemplate _jdbcTemplate;
static enum Singleton {
INSTANCE;
private static final UserActivity singleton = new UserActivity();
public UserActivity getSingleton() {
return singleton;
}
}
public UserActivity() {
this._dataSource = MysqlDb.getInstance().getDataSource();
this._jdbcTemplate = new JdbcTemplate(this._dataSource);
}
public void dostuff() {
...
}
}
在外面,我正在尝试
UserActivity.INSTANCE.getSingleton()
或
UserActivity.Singleton.
但是eclipse的代码完成没有找到任何东西
谢谢!
答案 0 :(得分:52)
诀窍是使枚举本身成为单身人士。试试这个:
public enum UserActivity {
INSTANCE;
private DataSource _dataSource;
private JdbcTemplate _jdbcTemplate;
private UserActivity() {
this._dataSource = MysqlDb.getInstance().getDataSource();
this._jdbcTemplate = new JdbcTemplate(this._dataSource);
}
public void dostuff() {
...
}
}
// use it as ...
UserActivity.INSTANCE.doStuff();
答案 1 :(得分:13)
INSTANCE
是Singleton
的成员,而不是UserActivity
的成员 - 所以您需要:
UserActivity.Singleton.INSTANCE.getSingleton();
但是,你实际上并没有让UserActivity
成为单身人士 - 通常你会让这个类型本身成为一个枚举,而不是在类型中嵌入一个枚举 ...
答案 2 :(得分:1)
public class UserActivity {
private DataSource _dataSource;
private JdbcTemplate _jdbcTemplate;
private static enum Singleton { // private, why not
INSTANCE;
private static final UserActivity singleton = new UserActivity();
public UserActivity getSingleton() {
return singleton;
}
}
private UserActivity() { // private !!(*)
this._dataSource = MysqlDb.getInstance().getDataSource();
this._jdbcTemplate = new JdbcTemplate(this._dataSource);
}
public static UserActivity getInstance() {
return UserActivity.Singleton.INSTANCE.getSingleton();
}
public void dostuff() {
...
}
}
并致电UserActivity.getInstance().doStuff();
你不能调用构造函数(*),你只能通过私有枚举中的INSTANCE获取UserActivity()类的实例 - 保证只创建一次