使用枚举的单身人士
我在stackoverflow上阅读了很多关于使用enum创建单例类的知识。 我一定错过了一些东西,因为我无法在任何地方到达INSTANCE。
这是我的代码:
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的代码完成没有找到任何东西
谢谢!
诀窍是使枚举本身成为单身人士。 尝试这个:
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();
INSTANCE
是Singleton
的成员,而不是UserActivity
的成员 – 因此您需要:
UserActivity.Singleton.INSTANCE.getSingleton();
但是,你实际上并没有将UserActivity
单例 – 通常你UserActivity
类型本身设为枚举,而不是在类型中嵌入枚举…
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()类的实例 – 保证只创建一次且仅一次