2011-11-06 17 views
23

He leído mucho sobre stackoverflow con respecto a la creación de clases singleton usando enum. Debo haberme perdido algo porque no puedo llegar al INSTANCE en ningún lado.singleton using enum

este es mi código:

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() { 
    ... 
    } 
} 

y fuera yo estoy tratando de hacer

UserActivity.INSTANCE.getSingleton() 

o

UserActivity.Singleton. 

pero la terminación del código de Eclipse no encuentra nada

gracias!

+0

Consulte aquí http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=3 – alexsmail

Respuesta

52

El truco es hacer que la enumeración sea el singleton. Prueba esto:

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

gracias por aclarar las cosas :) – ufk

13

INSTANCE es miembro de Singleton, no de UserActivity - por lo que se necesitaría:

UserActivity.Singleton.INSTANCE.getSingleton(); 

Sin embargo, no se ha hecho realidad un conjunto unitario UserActivity - normalmente que serías el tipo en sí una enumeración , no incrustar una enumeración dentro de el tipo ...

+0

Hiya .. para alguna razón por la que todavía estoy perdido. Nunca utilicé enum para una clase singleton antes. mente mostrando un pequeño ejemplo? – ufk

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() { 
    ... 
    } 
} 

y llame UserActivity.getInstance().doStuff();

No se puede llamar al constructor (*) y sólo se puede obtener una instancia de la clase UserActivity() a través de la instancia en la enumeración privada - que se garantiza que se creará una vez y solo una vez

+0

esto no es mejor que la respuesta aceptada. – NimChimpsky

+0

@NimC: Oh vamos, lo es. ufk estaba usando el patrón singleton Lazy Load del cual eres un enemigo conocido (: P) y estaba tratando de hacerlo funcionar - la respuesta aceptada fue simplemente tomar la enumeración en el nivel superior simplificando las cosas –

+0

la enumeración solo se cargará en demanda de todos modos (por el cargador de clases), esto no tiene ninguna ventaja. – NimChimpsky