2010-07-04 9 views
6

estoy usando un patrón de enumeración singletom así:Hacer una instancia de enumeración privada

public enum LicenseLoader implements ClientLicense { 
    INSTANCE; 

    /** 
    * @return an instance of ClientLicense 
    */ 
    public static ClientLicense getInstance() { 
     return (ClientLicense)INSTANCE; 
    } 

    ...rest of code 

} 

Ahora quiero devolver la interfaz y ocultar el hecho de que en realidad estamos utilizando una enumeración en absoluto. Quiero que el cliente use getInstance() y no LicenseLoader.INSTANCE porque un día puedo decidir usar un patrón diferente si es necesario.

¿Es posible que INSTANCE sea privado para la enumeración?

Respuesta

4

¿Qué tal hacer un public interface y private enum que implements dicha interfaz, con un singleton INSTANCE constante?

Por lo tanto, algo como esto (todos en una clase por razones de brevedad):

public class PrivateEnum { 

    public interface Worker { 
     void doSomething(); 
    } 

    static private enum Elvis implements Worker { 
     INSTANCE; 
     @Override public void doSomething() { 
      System.out.println("Thank you! Thank you very much!"); 
     } 
    } 

    public Worker getWorker() { 
     return Elvis.INSTANCE; 
    } 
} 

De esta manera, no se está exponiendo Elvis.INSTANCE (o incluso enum Elvis en absoluto), utilizando un interface para definir su funcionalidad, ocultando todos los detalles de implementación.

+0

Buena idea gracias. – jax

+1

Esto funcionó a la perfección, me permitió hacer que el paquete Worker sea privado y también permitirme obtener algunas cosas que quería mantener en privado con el mundo exterior pero disponibles dentro del contexto del paquete. – jax

+0

La instancia 'enum' todavía está disponible, como expliqué. –

1

Todas las constantes enum están accesibles. Por ejemplo, mediante deserialización o los enum métodos de reflexión específicos.

Como siempre, sugiero evitar los singletons.

+1

Estás dando un mal consejo. "El patrón de singleton enum proporciona una garantía inquebrantable contra la creación de instancias múltiples, incluso frente a la sofisticada serialización o ataques de reflexión". (Java efectivo - Joshua Bloch) – jax

+1

No, no te estoy dando un mal consejo. –

+0

@Tom: ¿qué quiere decir con que "todavía está disponible" (comentario a mi respuesta)? el modificador de accesibilidad 'privado' en' enum' no es blindado (por ejemplo, ataque 'setAccessible'), pero esto es cierto para cada' clase', no solo 'enum'. – polygenelubricants

Cuestiones relacionadas