在我们的项目中,我们都有这种枚举。它们工作得很好,但我们不确定它们。
特别使用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响应。她也很好。
答案 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
添加enums
来eunums
进行查找快一点但是对于你拥有的少量{{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;
}