2011-01-17 12 views
6

He visto construcciones con una enumeración declarada dentro de una enumeración. Para qué se usa esto ?enum anidado, ¿por qué se usa?

+9

Aquí hay un pensamiento: ¿Qué tal un ejemplo de lo que está preguntando? Llámame loco ... –

+3

OK, estás loco (alguien tuvo que hacerlo :)). –

+0

algo así como – mafalda

Respuesta

7

Enum en Java no se puede extender, por lo que si quiere cotejar enumeraciones fuertemente relacionadas en un solo lugar, puede utilizar estas construcciones enum anidadas. Por ejemplo:

public enum DepartmentsAndFaculties 
{ 
    UN (null, "UN", "University"), 
    EF (UN, "EF", "Engineering Faculty"), 
    CS (EF, "CS", "Computer Science & Engineering"), 
    EE (EF, "EE", "Electrical Engineering"); 

    private final DepartmentsAndFaculties parent; 
    private final String code, title; 

    DepartmentsAndFaculties(DepartmentsAndFaculties parent, String code, String title) 
    { 
     this.parent = parent; 
     this.code = code; 
     this.title = title; 
    } 

    public DepartmentsAndFaculties getParent() 
    { 
     return parent; 
    } 

    public String getCode() 
    { 
     return code; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 
} 

Aquí, las enumeraciones internas constan de {parent enum, code, title} combinaciones. Ejemplo de uso:

DepartmentsAndFaculties cs = DepartmentsAndFaculties.CS; 
cs.getTitle(); 

Puede ver el poder de las enumeraciones anidados jerárquicos en la construcción de entidades/enumeraciones.

+0

esto suena exactamente como lo que tengo que hacer. actualmente tengo una clase que contiene enumeraciones relacionadas. Pero en su código solo veo una enumeración DepartmentsAndFaculties declarada. ¿dónde está la otra enumeración? – mafalda

+0

¿La otra enumeración? DepartmentsAndFaculties es una enumeración y se extiende por las enumeraciones de las Naciones Unidas, EF, CS y EE. Puede referirse a sub-enums a través de DepartmentsAndFaculties.XX donde XX es un nombre de referencia de sub-enum. – Juvanis

2

Puede significar un Enum como tipo interno. Esto se ve más típicamente cuando el tipo externo es una clase o una interfaz, pero supongo que no hay ninguna razón para que esto no se pueda hacer con enum como un elemento externo.

Los tipos internos se refieren en parte a la organización del código. Pueden ser útiles para evitar crear un grupo de archivos separados cuando tiene algunos tipos relacionados. A veces puede hacer que el nombre de tipo sea más intuitivo. Por ejemplo, vea la clase Map y su clase de Entrada interna. La mayoría de las referencias externas a Entry usarían el formato Map.Entry, que es muy legible.

La otra razón para los tipos internos es que si el tipo externo es una clase o una enumeración, entonces el tipo interno puede ser no público. Esto es útil para ocultar tipos que son detalles de implementación del tipo externo.

+0

sí me refiero a enum como un tipo interno. ¿Tiene algunas referencias de código que usan la enumeración interna? – mafalda

0

He utilizado enumeraciones anidadas en casos excepcionales en los que quería aplicar una convención de nomenclatura sobre los valores enum, si las adiciones de nuevos nombres tendrían consecuencias para las operaciones u otras personas. Aquí está un ejemplo:

public enum MessageTemplateName { 

    account_verify, 
    vendor_job_request, 
    account_job_confirmed, 
    vendor_job_confirmed, 
    account_friend_request, 
    account_job_accepted, 
    vendor_job_accepted_by_other; 

    /** Make sure you tell operations if you're adding a new recipient */ 
    private enum Recipient { account, vendor } 

    private Recipient recipient; 
    private String messageName; 

    MessageTemplateName() { 
     final int firstUnderscore = name().indexOf('_'); 
     recipient = Recipient.valueOf(name().substring(0, firstUnderscore)); 
     messageName = name().substring(firstUnderscore+1); 
    } 

    public String getTemplateUrl (String baseUrl) { 
     if (!baseUrl.endsWith("/")) baseUrl += "/"; 
     return baseUrl + recipient.name() + "/" + messageName + ".vm"; 
    } 

} 

estoy usando una enumeración porque quiero ser capaz de pasar alrededor de un "nombre de plantilla de mensaje" genérico en varios lugares. Como puede ver, la primera parte del nombre enum corresponde a un directorio en un servidor, y el resto del nombre se refiere a un nombre de archivo de plantilla de Velocity. Si los compañeros ingenieros comenzaron a introducir nuevas constantes, me gustaría asegurarme de que se archivaron con el "destinatario" apropiado, o si es legítimo que se necesite crear un nuevo destinatario, que es un esfuerzo consciente hacerlo, e informarán operaciones (crear el directorio en producción, colocar cualquier monitoreo/permiso en su lugar, etc.).

Existe un argumento aceptable de que, si en algún momento su Enum se vuelve demasiado complejo, puede reemplazarlo con una jerarquía de clase/clase junto con una enumeración mucho más simple. No estoy seguro de dónde trazar la línea, pero supongo que lo anterior se dirige en esa dirección.

Cuestiones relacionadas