Подтвердить что ты не робот

Singleton с использованием перечисления

Я много читал о 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 не находит ничего

спасибо!

4b9b3361

Ответ 1

Хитрость заключается в том, чтобы сделать enum самоограниченным. Попробуйте следующее:

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

Ответ 2

INSTANCE является членом Singleton, а не UserActivity - поэтому вам понадобится:

UserActivity.Singleton.INSTANCE.getSingleton();

Тем не менее, вы на самом деле не сделали UserActivity singleton - обычно вы должны сделать сам тип enum, а не встраивать перечисление в тип...

Ответ 3

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

Вы не можете вызвать конструктор (*), и вы можете получить экземпляр класса UserActivity() через INSTANCE в приватном перечислении, который, как гарантируется, будет создан один раз и только один раз