使用枚举的单身人士

时间:2011-11-06 14:32:55

标签: java enums 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的代码完成没有找到任何东西

谢谢!

3 个答案:

答案 0 :(得分:52)

诀窍是使枚举本身成为单身人士。试试这个:

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

答案 1 :(得分:13)

INSTANCESingleton的成员,而不是UserActivity的成员 - 所以您需要:

UserActivity.Singleton.INSTANCE.getSingleton();

但是,你实际上并没有让UserActivity成为单身人士 - 通常你会让这个类型本身成为一个枚举,而不是在类型中嵌入一个枚举 ...

答案 2 :(得分:1)

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()类的实例 - 保证只创建一次