我的枚举是正确的吗?

时间:2009-07-29 12:25:14

标签: java enums correctness

在我们的项目中,我们都有这种枚举。它们工作得很好,但我们不确定它们。

特别使用getDocumentType(String)方法。

有没有办法避免在所有Enums字段上进行迭代?

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

编辑: 检查newacct响应。她也很好。

4 个答案:

答案 0 :(得分:5)

由于写入枚举的限制,你将不得不在某处进行迭代。在理想的世界中,您将从DocumentType的构造函数中填充静态Map,但这是不允许的。

我能建议的最好的方法是在静态初始化程序中执行一次迭代,并将枚举存储在查找表中:

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

至少你不会每次都进行迭代,虽然我怀疑你会看到任何有意义的性能提升。

答案 1 :(得分:1)

据我所知(这是值得的),这是做你想做的最好的方式。

至少我会这样做。

如果您的enum计数显着增加(数十万),您可能需要Map Strings添加enumseunums进行查找快一点但是对于你拥有的少量{{1}},这可能是过度的。

答案 2 :(得分:1)

对我来说很好看。

我会按原样离开迭代。当然你可以添加Map&lt;'label','DocumentType'&gt;实现到枚举类并进行查找,但不会显着提高性能。

答案 3 :(得分:1)

如果字符串在编译时是已知的,并且它们是有效的标识符,您可以直接将它们用作枚举的名称:

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

然后通过.valueOf()获取它。例如:

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