使用枚举的单身人士

我在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(); 

INSTANCESingleton的成员,而不是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()类的实例 – 保证只创建一次且仅一次