- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
public enum Permission{
SUPERUSER,
MANAGER,
USER;
public static Permission value(String name) {
return mapsValues.get(name);
}
private final static Map<String, Permission> mapsValues;
static {
Map<String, Permission> map= new HashMap<String, Permission>();
Permission[] pp = values();
for (Permission p : pp)
map.put(p.name(), p);
mapsValues = Collections.unmodifiableMap(map);
}
}
wvxvw 31.05.2012 18:30 # +1
lohpider 31.05.2012 18:45 # −13
rat4 31.05.2012 20:44 # 0
roman-kashitsyn 31.05.2012 21:19 # +3
wvxvw 31.05.2012 22:57 # 0
roman-kashitsyn 31.05.2012 23:25 # 0
получаем объект енума по имени. т.е. в точности valueOf.
wvxvw 01.06.2012 00:15 # 0
Т.е. как видно тут: метод использует генерик - т.е. никакой рантайм проверки. Может быть автора именно это не устроило...
Вообще reflection в Яве странный. Генерики которые потом улетучиваются + никакой проверки типа в рантайме :/
roman-kashitsyn 01.06.2012 00:58 # 0
http://ideone.com/ToPeP
Дженерики не совсем улетучиваются, при наследовании от обобщённого класса с подстановкой типа можно в рантайме узнать этот самый тип. Что кстати и происходит в случае с Enum.
Зачем автор так сделал, мне совершенно ясно: valueOf скорее всего перебирает экземпляры, т.е. сложность поиска O(N). Автор же получил O(1).
Однако также мне совершенно ясно, что профита от этого ровно нуль. Сравнить в цикле три строки и сделать лукап по хэш-таблице - разницы скорее всего вообще нет, только ненужный расход памяти.
wvxvw 31.05.2012 23:06 # 0
К слову о reflection. Как бы values(), скорее всего совсем не быстрый / ну и получить их по-другому видимо низзя.
guest 01.06.2012 15:56 # −1