Pregunta

Todo sobre nuestro proyecto, tenemos este tipo de enumeraciones. Que funciona muy bien, pero no están seguros acerca de ellos.

Especialmente con el método getDocumentType (String).

¿Hay una manera de evitar la iteración sobre todo el campo de enumeraciones?

public enum DocumentType {

    UNKNOWN("Unknown"),
    ANY("Any"),
    ASSET(Asset.class.getSimpleName()),
    MEDIA(Media.class.getSimpleName()),
    MEDIA35MM(Media.class.getSimpleName() + " 35mm");


    private String label;

    private DocumentType(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public static DocumentType getDocumentType(String label){
        for(DocumentType documentType : DocumentType.values()){
            if(documentType.getLabel().equals(label)){
                return documentType;
            }
        }
        return UNKNOWN;
    }
}

Editar: Marque la respuesta newacct. Ella está bien también.

¿Fue útil?

Solución

Vas a tener que hacer esa iteración en alguna parte, debido a las restricciones en la escritura enumeraciones. En un mundo ideal, debería rellenar un mapa estático desde dentro del constructor de DocumentType, pero eso no está permitido.

Lo mejor que puedo sugerir es realizar la iteración una vez en un inicializador estático, y el almacenamiento de las enumeraciones en una tabla de búsqueda:

public enum DocumentType {

    .... existing enum stuff here

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>();
    static {
        for(DocumentType documentType : DocumentType.values()){
            typesByLabel.put(documentType.label, documentType);
        }
    }

    public static DocumentType getDocumentType(String label){
        if (typesByLabel.containsKey(label)) {
            return typesByLabel.get(label);
        } else {
            return UNKNOWN;
        }
    }
}

Al menos que no haré la iteración cada vez, aunque dudo que ve ninguna mejora significativa de rendimiento.

Otros consejos

Por lo que yo sé (Por si sirve de algo), que es la mejor manera de hacer lo que quiera.

Así es como yo lo haría por lo menos.

Si el recuento de enum crece significativamente (par de cientos de miles) - es posible que desee añadir un Maping de Strings a enums para hacer la consulta de un poco más rápido. Sin embargo, para la pequeña cantidad de eunums que tiene, esto puede ser excesivo.

Si las cuerdas se conocen en tiempo de compilación, y si son identificadores válidos, sólo puede utilizarlos como los nombres de las enumeraciones directamente:

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm }

y luego conseguirlo por .valueOf(). Por ejemplo:

String label = "Asset";
DocumentType doctype;
try {
    doctype = DocumentType.valueOf(label);
} catch (IllegalArgumentException e) {
    doctype = DocumentType.Unknown;
}

se ve bien para mí.

Me dejo la iteración como es. Claro que podría añadir un mapa < 'etiqueta', 'DocumentType'> aplicación a la clase de enumeración y hacer una búsqueda pero no va a aumentar el rendimiento significativamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top