列挙型を使用したシングルトンクラスの作成に関して、stackoverflowについてたくさん読みました。どこにもインスタンスに到達できないので、何かを逃したに違いありません。
これは私のコードです:
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
をシングルトンにしたわけではありません。通常は、型自体を列挙型にし、列挙型を埋め込みませんwithin型...
_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()クラスのインスタンスを取得できます。これは1回だけ作成されることが保証されています。