Skip to content

Commit 40ff4cb

Browse files
committed
optimize EnumConverter
1 parent 0eada2e commit 40ff4cb

File tree

1 file changed

+18
-30
lines changed

1 file changed

+18
-30
lines changed

src/main/java/com/github/_1c_syntax/bsl/reader/common/converter/EnumConverter.java

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
2727
import lombok.extern.slf4j.Slf4j;
2828

29+
import java.util.HashMap;
30+
import java.util.Map;
31+
2932
/**
3033
* Класс-конвертер из строкового значения в элемент перечисления.
3134
* Для каждого конкретного перечисления надо создать собственный класс, унаследованный от EnumWithValues.
@@ -41,53 +44,38 @@ public class EnumConverter<T extends Enum<T> & EnumWithValue> extends AbstractSi
4144
+ URL_TEMPLATE;
4245

4346
private final Class<T> enumClazz;
47+
private final T unknown;
48+
private final Map<String, T> enumElements;
4449

4550
public EnumConverter(Class<T> clazz) {
4651
enumClazz = clazz;
52+
unknown = unknown();
53+
enumElements = new HashMap<>();
54+
for (T item : enumClazz.getEnumConstants()) {
55+
enumElements.put(item.value(), item);
56+
if (UsePurposes.class.isAssignableFrom(enumClazz)) {
57+
enumElements.put(((UsePurposes) item).valueVar2(), item);
58+
}
59+
}
4760
}
4861

4962
@Override
5063
public Object fromString(String sourceString) {
51-
Object result;
52-
if (UsePurposes.class.isAssignableFrom(enumClazz)) {
53-
result = fromValueStringUsePurposes(sourceString);
54-
} else {
55-
result = fromValue(enumClazz, sourceString);
56-
}
57-
64+
var result = enumElements.get(sourceString);
5865
if (result == null) {
5966
LOGGER.warn(WARN_TEMPLATE, sourceString, enumClazz.getName(), sourceString);
60-
return unknown(enumClazz);
67+
result = unknown;
6168
}
6269
return result;
6370
}
6471

65-
private static <T extends Enum<T> & EnumWithValue> T fromValue(Class<T> clazz, String value) {
66-
for (T item : clazz.getEnumConstants()) {
67-
if (item.value().equals(value)) {
68-
return item;
69-
}
70-
}
71-
return null;
72-
}
73-
74-
private static Object fromValueStringUsePurposes(String sourceString) {
75-
for (UsePurposes item : UsePurposes.class.getEnumConstants()) {
76-
if (item.valueVar1().equals(sourceString)
77-
|| item.valueVar2().equals(sourceString)) {
78-
return item;
79-
}
80-
}
81-
return null;
82-
}
83-
84-
private static <T extends Enum<T> & EnumWithValue> T unknown(Class<T> clazz) {
85-
for (T item : clazz.getEnumConstants()) {
72+
private T unknown() {
73+
for (T item : enumClazz.getEnumConstants()) {
8674
if (item.isUnknown()) {
8775
return item;
8876
}
8977
}
90-
throw new IllegalStateException("No unknown value found for enum " + clazz.getName());
78+
throw new IllegalStateException("No unknown value found for enum " + enumClazz.getName());
9179
}
9280

9381
@Override

0 commit comments

Comments
 (0)