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

    +117

    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
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    @Override
    public void afterPersistenceInit() {
    	val conn = emProvider.get().unwrap(Connection.class);
    
    	try {
    		log.info("Transaction isolation level: {}", getLevelString(conn.getTransactionIsolation()));
    	} catch (final SQLException e) {
    		log.error("Error getting transaction isolation level", e);
    	}
    }
    
    private String getLevelString(final int isolationLevel) {
    	// Poor man's enums. Use reflection to find a constant with the given value
    	try {
    		for (val maybeLevelConstant: Connection.class.getDeclaredFields()) {
    			if (maybeLevelConstant.getType() == int.class && maybeLevelConstant.getName().startsWith("TRANSACTION_")
    					&& maybeLevelConstant.getInt(null) == isolationLevel) {
    				return maybeLevelConstant.getName();
    			}
    		}
    	} catch (final IllegalArgumentException | IllegalAccessException e) {
    		return "UNKNOWN";
    	}
    	
    	return "UNKNOWN";
    }

    Ищем рефлексией константу с нужным значением. И всё для того, чтобы напечатать её в логе. Вот что крест животворящий отсутствие энумов в legacy API делает.

    Запостил: someone, 23 Октября 2014

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

    • это не Java (смущает val в строке 15)?
      и, поскольку это константы, имеет смысл использовать массив или карту, не рефлексируя на каждом логе (представляю, сколько ресурсов отъедает логирование).

      и еще мне нравится логирование ошибок логирования. особенно веселыми бывают случаи, когда логгер не сумел инициализироваться, и это пытаются логировать им же.
      Ответить
      • Это Java + lombok.

        > и, поскольку это константы, имеет смысл использовать массив или карту, не рефлексируя на каждом логе (представляю, сколько ресурсов отъедает логирование).

        Этот код вызывается один раз при запуске сервера. А константы определены в java.sql.Connection. Если бы они были определены у нас, они были бы энумом. :)

        > и еще мне нравится логирование ошибок логирования. особенно веселыми бывают случаи, когда логгер не сумел инициализироваться, и это пытаются логировать им же.

        Это не ошибка логирования, а ошибка получения данных от JDBC-соединения. Ловится-то SQLException.
        Ответить
    • эм... Я бы просто захардкодил мапу значение -> имя.
      Ответить
      • если там последовательные значения, то лучше просто массив.
        а то придется городить автобоксинг-огород, брр.
        Ответить

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