web-dev-qa-db-ja.com

列挙型を使用したシングルトン

列挙型を使用したシングルトンクラスの作成に関して、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のコード補完では何も見つかりません

ありがとう!

23
ufk

秘訣は、列挙型自体をシングルトンにすることです。これを試して:

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();
52
Stephen C

INSTANCESingletonのメンバーであり、UserActivityのメンバーではないため、次のものが必要です。

UserActivity.Singleton.INSTANCE.getSingleton();

ただし、実際にはUserActivityをシングルトンにしたわけではありません。通常は、型自体を列挙型にし、列挙型を埋め込みませんwithin型...

13
Jon Skeet
_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回だけ作成されることが保証されています。

1
Mr_and_Mrs_D