- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
public enum Action {
ADD, DELETE, UPDATE, REFRESH;
public static Action getEnum(String value) {
for (Action current : values()) {
if (current.name().equalsIgnoreCase(value)) {
return current;
}
}
throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
}
@Override
public String toString() {
return this.name().toLowerCase();
}
}
public enum Manager {
USER, ROLE, SERVICE;
public static Manager getEnum(String value) {
for (Manager current : values()) {
if (current.name().equalsIgnoreCase(value)) {
return current;
}
}
throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
}
@Override
public String toString() {
return this.name().toLowerCase();
}
public boolean isUser() {
return this == USER;
}
public boolean isRole() {
return this == ROLE;
}
public boolean isService() {
return this == SERVICE ;
}
}
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
@Override
public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
return new StringToEnumConverter<T>(targetType);
}
private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> {
private Class<T> enumType;
private StringToEnumConverter(Class<T> enumType) {
this.enumType = enumType;
}
@Override
public T convert(String source) {
if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.manager")) {
return (T) Manager.getEnum(source);
}
if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.action")) {
return (T) Action.getEnum(source);
}
return (T) Enum.valueOf(this.enumType, source);
}
}
}
/* -- Mapping -- */
@RequestMapping(value = "manage/index/{manager}/{action}", method = RequestMethod.GET)
public String addValueToEntity(@PathVariable("manager") Manager manager, @PathVariable("action") Action action) {
...
@RequestMapping(value = "/manage/index", method = RequestMethod.GET)
public String indexPage(ModelMap model, @RequestParam(value = "manager", required = true) Manager manager) {
...
Spring MVC. Проблема в том что строка lovercase а значения Enum-ов uppercase
Anderson 11.01.2014 03:18 # +2
wvxvw 11.01.2014 03:36 # 0
bormand 11.01.2014 09:33 # 0
А что с распараллеливанием? Они ж final. И сами по себе вроде иммутабельные. Не должно мешать...
wvxvw 11.01.2014 11:31 # 0
bormand 11.01.2014 11:38 # +1
А это уже личная проблема того, кто эти методы туда добавил. Все стандартные методы инума (toString, valueOf, и т.п.) - реентерабельны, т.к. не меняют никакого состояния (да его и не изменишь, там все final).
И никаких блокировок и volatile жаба сама по себе добавлять не будет.
wvxvw 11.01.2014 11:44 # 0
bormand 11.01.2014 11:52 # 0
IllegalArgumentException в valueOf() разве что, если ей туда передать что-то, чего нет в enum'е.
Ну а вообще, никто не мешает добавить своих полей, методов, и превратить свое перечисление в нереентерабельное говно, кидающее ошибки на каждый чих :)
wvxvw 11.01.2014 12:12 # 0
bormand 11.01.2014 12:27 # 0
> другом треде кто-то пытается перечислить все элементы инумератора
Класслоадеры не выгружаются, пока хоть один объект из этого класслоадера кому-то нужен. Так что другой тред спокойно дочитает все элементы ;)
P.S. Кстати енумы из разных класслоадеров несравнимы. Даже если их загрузили из одного .class файлика.
wvxvw 14.01.2014 21:32 # +1
Т.е. это в чем-то упрощает жизнь писателям хайбернейт приложений в том, что им не нужно писать деплой скрипты - хайбернейт за них все сделает, но вот я бы не назвал это качественной работой.
bormand 11.01.2014 11:56 # +9
Это что еще за чемодан любовника?
kegdan 11.01.2014 12:58 # 0
guest 11.01.2014 14:44 # 0
Stertor 14.01.2014 21:45 # +4
он не учел таксу на багаж