Вопрос

По всему нашему проекту у нас есть такого рода перечисления.Они работают просто отлично, но мы не уверены в них.

Особенно с помощью метода 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.С ней тоже все в порядке.

Это было полезно?

Решение

Вам придется где-то выполнить эту итерацию из-за ограничений при написании перечислений.В идеальном мире вы бы заполнили статическую карту из конструктора 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;
        }
    }
}

По крайней мере, вы не будете выполнять итерацию каждый раз, хотя я сомневаюсь, что вы увидите какое-либо значимое улучшение производительности.

Другие советы

Насколько я знаю (чего бы это ни стоило), это лучший способ делать то, что вы хотите.

По крайней мере, так бы я это сделал.

Если ваш enum количество значительно увеличивается (пара сотен тысяч), возможно, вы захотите добавить Mapинг из Strings Для enums чтобы выполнить поиск немного быстрее.Но для небольшого количества eunums у вас есть, это может быть излишеством.

Если строки известны во время компиляции и если они являются допустимыми идентификаторами, вы можете просто использовать их как имена перечислений напрямую:

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

По-моему, все в порядке.

Я бы оставил итерацию такой, какая она есть.Уверен, вы могли бы добавить Карту<'label','DocumentType'> перейдите к классу enum и выполните поиск, но это существенно не повысит производительность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top