Pergunta

Em todo o nosso projeto, temos esse tipo de enumeração. Eles funcionam muito bem, mas não temos certeza sobre eles.

Especialmente com o método getDocumentType (String).

Existe uma maneira de evitar a iteração em todo o campo da enumeração?

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: verifique a resposta newAcct. Ela também está bem.

Foi útil?

Solução

Você terá que fazer essa iteração em algum lugar, devido às restrições por escrito enumes. Em um mundo ideal, você preencheria um mapa estático do construtor do DocumentType, mas isso não é permitido.

O melhor que posso sugerir é realizar a iteração uma vez em um inicializador estático e armazenar as enumistas em uma tabela de pesquisa:

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;
        }
    }
}

Pelo menos você não fará a iteração sempre, embora eu duvide que você verá qualquer melhoria significativa de desempenho.

Outras dicas

Até onde eu sei (pelo que vale a pena), essa é a melhor maneira de fazer o que você deseja.

É assim que eu faria pelo menos.

Se seu enum o conde cresce significativamente (centenas - milhares), você pode querer adicionar um Mapde Strings para enums Para fazer a pesquisa um pouco mais rápido. Mas pela pequena quantidade de eunums Você tem, isso pode ser um exagero.

Se as strings forem conhecidas em tempo de compilação e se forem identificadores válidos, basta usá-las como nomes das enumes diretamente:

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

E então pegue -o .valueOf(). Por exemplo:

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

Parece bem para mim.

Eu deixaria a iteração como está. Claro que você pode adicionar um mapa <'rótulo', 'DocumentType'> implementação à classe Enum e fazer uma pesquisa, mas não aumentará significativamente o desempenho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top