26
26
import com .thoughtworks .xstream .converters .basic .AbstractSingleValueConverter ;
27
27
import lombok .extern .slf4j .Slf4j ;
28
28
29
+ import java .util .HashMap ;
30
+ import java .util .Map ;
31
+
29
32
/**
30
33
* Класс-конвертер из строкового значения в элемент перечисления.
31
34
* Для каждого конкретного перечисления надо создать собственный класс, унаследованный от EnumWithValues.
@@ -41,53 +44,38 @@ public class EnumConverter<T extends Enum<T> & EnumWithValue> extends AbstractSi
41
44
+ URL_TEMPLATE ;
42
45
43
46
private final Class <T > enumClazz ;
47
+ private final T unknown ;
48
+ private final Map <String , T > enumElements ;
44
49
45
50
public EnumConverter (Class <T > clazz ) {
46
51
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
+ }
47
60
}
48
61
49
62
@ Override
50
63
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 );
58
65
if (result == null ) {
59
66
LOGGER .warn (WARN_TEMPLATE , sourceString , enumClazz .getName (), sourceString );
60
- return unknown ( enumClazz ) ;
67
+ result = unknown ;
61
68
}
62
69
return result ;
63
70
}
64
71
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 ()) {
86
74
if (item .isUnknown ()) {
87
75
return item ;
88
76
}
89
77
}
90
- throw new IllegalStateException ("No unknown value found for enum " + clazz .getName ());
78
+ throw new IllegalStateException ("No unknown value found for enum " + enumClazz .getName ());
91
79
}
92
80
93
81
@ Override
0 commit comments