- 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);
}
}
получаем объект енума по имени. т.е. в точности valueOf.
Т.е. как видно тут: метод использует генерик - т.е. никакой рантайм проверки. Может быть автора именно это не устроило...
Вообще reflection в Яве странный. Генерики которые потом улетучиваются + никакой проверки типа в рантайме :/
http://ideone.com/ToPeP
Дженерики не совсем улетучиваются, при наследовании от обобщённого класса с подстановкой типа можно в рантайме узнать этот самый тип. Что кстати и происходит в случае с Enum.
Зачем автор так сделал, мне совершенно ясно: valueOf скорее всего перебирает экземпляры, т.е. сложность поиска O(N). Автор же получил O(1).
Однако также мне совершенно ясно, что профита от этого ровно нуль. Сравнить в цикле три строки и сделать лукап по хэш-таблице - разницы скорее всего вообще нет, только ненужный расход памяти.
К слову о reflection. Как бы values(), скорее всего совсем не быстрый / ну и получить их по-другому видимо низзя.