синглтон используя enum - PullRequest
       7

синглтон используя enum

23 голосов
/ 06 ноября 2011

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

спасибо!

Ответы [ 3 ]

52 голосов
/ 06 ноября 2011

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

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();
13 голосов
/ 06 ноября 2011

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

UserActivity.Singleton.INSTANCE.getSingleton();

Однако вы на самом деле не сделали UserActivity синглтоном - обычновы бы сами сделали тип enum, а не вставили бы enum в type ...

1 голос
/ 14 октября 2012
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 в приватном enum - который гарантированно будет создан один раз и только один раз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...