правильно ли мое Перечисление?
-
20-09-2019 - |
Вопрос
По всему нашему проекту у нас есть такого рода перечисления.Они работают просто отлично, но мы не уверены в них.
Особенно с помощью метода 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 и выполните поиск, но это существенно не повысит производительность.