代码之家  ›  专栏  ›  技术社区  ›  Antoine Claval

我的列举正确吗?

  •  5
  • Antoine Claval  · 技术社区  · 15 年前

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

    特别是使用getdocumenttype(string)方法。

    有没有一种方法可以避免对所有枚举字段进行迭代?

    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 回复  |  直到 15 年前
        1
  •  5
  •   skaffman    15 年前

    由于编写枚举的限制,您将不得不在某个地方执行该迭代。在理想情况下,您可以从documenttype的构造函数中填充静态映射,但这是不允许的。

    我建议最好是在静态初始值设定项中执行一次迭代,并将枚举存储在查找表中:

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

    至少你不会每次都做迭代,尽管我怀疑你会看到任何有意义的性能改进。

        2
  •  1
  •   jjnguy Julien Chastang    15 年前

    据我所知(为了它的价值),这是做你想做的最好的方式。

    至少我会这样做。

    如果你 enum 计数显著增加(几十万),您可能需要添加 Map ING Strings enums 以更快的速度进行查找。但对于少量的 eunums 你有,这可能太过分了。

        3
  •  1
  •   newacct    15 年前

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

    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;
    }
    
        4
  •  1
  •   jball    15 年前

    我觉得不错。

    我会让迭代保持原样。当然,您可以将map<'label'、'documentType'>实现添加到枚举类中并进行查找,但这不会显著提高性能。

    推荐文章