1. Java / Говнокод #10509

    +76

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 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);
    	}
    	
    }

    Запостил: xaoc, 31 Мая 2012

    Комментарии (10) RSS

    • Это типа вместо того, чтобы reflection использовать?
      Ответить
      • показать все, что скрытоОбоим по минусу, СУКИ.
        Ответить
      • Это вместо java.lang.Class.enumConstantDirectory
        Ответить
      • Какой ещё reflection? У енумов есть valueOf().
        Ответить
        • Ну, не знаю, я понял этот код как попытку записать куда-то централизовано имена и значения всех членов этого энума, как замена reflection. Т.е, чтобы, например, их в цикле где-нибудь перебрать, в смысле автор хотел побороть values(), а не valueOf().
          Ответить
          • > public static Permission value(String name)

            получаем объект енума по имени. т.е. в точности valueOf.
            Ответить
            • Ну как бы не похоже, что автор не знал об существовании метода - он же как всеми остальными методами оперирует. Т.е. я думаю, что у него было какое-то предубеждение против того, чтобы использовать valueOf.
              Т.е. как видно тут:
              http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Enum.java#Enum.valueOf%28java.lang.Class%2Cjava.lang.String%29
              метод использует генерик - т.е. никакой рантайм проверки. Может быть автора именно это не устроило...
              Вообще reflection в Яве странный. Генерики которые потом улетучиваются + никакой проверки типа в рантайме :/
              Ответить
              • дык метод у конкретного енума вызывается
                http://ideone.com/ToPeP
                Дженерики не совсем улетучиваются, при наследовании от обобщённого класса с подстановкой типа можно в рантайме узнать этот самый тип. Что кстати и происходит в случае с Enum.

                Зачем автор так сделал, мне совершенно ясно: valueOf скорее всего перебирает экземпляры, т.е. сложность поиска O(N). Автор же получил O(1).
                Однако также мне совершенно ясно, что профита от этого ровно нуль. Сравнить в цикле три строки и сделать лукап по хэш-таблице - разницы скорее всего вообще нет, только ненужный расход памяти.
                Ответить
        • http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Class.java#Class.getEnumConstantsShared%28%29

          К слову о reflection. Как бы values(), скорее всего совсем не быстрый / ну и получить их по-другому видимо низзя.
          Ответить
    • КГ / АМ!
      Ответить

    Добавить комментарий