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

    +119

    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
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    /**
     * Imbues the given {@link Font} with support for fallback fonts,
     * needed to display CJK characters in fonts that do not support them.
     * 
     * This is an ugly mess that depends on internal Sun APIs. Use sparingly!
     *
     * @param font the font
     * @return the composite font UI resource
     */
    public static FontUIResource getCompositeFontUIResource(final Font font) {
    	try {
    		Class<?> klass;
    		
    		try {
    			// Java 7
    			klass = Class.forName("sun.font.FontUtilities");
    		} catch (final ClassNotFoundException e) {
    			// Java 6
    			klass = Class.forName("sun.font.FontManager");
    		}
    		
    		// Invoke static method that wraps the font
    		val method = klass.getMethod("getCompositeFontUIResource", Font.class);
    		return (FontUIResource) method.invoke(null, font);
    	} catch (final ClassNotFoundException e) {
    		// Long block of catches that cannot happen on a Sun JRE
    		throw new AssertionError(e);
    	} catch (final IllegalAccessException e) {
    		throw new AssertionError(e);
    	} catch (final IllegalArgumentException e) {
    		throw new AssertionError(e);
    	} catch (final InvocationTargetException e) {
    		throw new AssertionError(e);
    	} catch (final NoSuchMethodException e) {
    		throw new AssertionError(e);
    	} catch (final SecurityException e) {
    		throw new AssertionError(e);
    	}
    }

    Запостил: someone, 10 Июля 2012

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

    • благими намерениями Sun...
      Ответить
      • Да не только.
        Меня насмешило вот что:
        >catch (final ClassNotFoundException e) {
        > catch (final IllegalAccessException e) {
        > catch (final IllegalArgumentException e) {
        > catch (final InvocationTargetException e) {

        На кой там final у всех эксепшонов поставлен?
        Ответить
        • Я считаю, что нужно всё по возможности делать final. Локальные переменные, параметры функций... Если что-то не final - это сигнал, что либо код некорректен, либо есть веские причины перезаписывать переменную.
          Ответить
        • это на будущее:
          во-первых, чтобы не присвоить случайно,
          во-вторых, final-переменные доступны в замыканиях внутренних анонимных классах.

          я уже упоминал, что я настроил Eclipse так, чтобы он все неизменяемые переменные (плюс поля и параметры) сам делал finalьными - так я автоматически получаю их в анонимных классах, а также сразу информирован, если случайно попытаюсь изменить. Убрать при необходимости final просто, а багов, связанных с изменениями ссылок (скажем, передал объект куда-то, потом создал вместо него новый, а переданный старый объект-то живет и не отражает изменений)
          Ответить
          • > я уже упоминал, что я настроил Eclipse так, чтобы он все неизменяемые переменные (плюс поля и параметры) сам делал finalьными

            КАК?! Хотеть!
            Ответить
            • - Window -> Preferences
              -- Java -> Editor -> Save Actions
              --- "Perform the selected actions on save", "Additional actions", "Configure..."
              ---- "Code Style", "Use modifier 'final' where possible" и там все эти галки "Private fields", "Parameter","Local variables"

              а вообще я там отметил все, кроме:
              "Sort members" - т.к. вместе с форматированием в редких случаях работает некорректно и портит код (видимо, пытается параллельно и отформатировать и отсортировать)
              "Unused code" - не надо убирать при сохранении

              Но эти галки в похожем диалоге "Code cleanup" есть.
              Если еще форматирование настроить под себя (например, я сделал чтобы убирались пустые строки), то вообще сказка.
              Ну и в "Java"->"Compiler"->"Errors/Warnings" поставил почти все галки, вкупе с FindBugs вообще подсвечивает все подозрительные места. Я не успокаиваюсь, пока в коде есть ворнинги.
              Ответить
              • А я использую checkstyle. Он подсвечивает, если где-то что-то не final, что может быть final.
                Ответить
                • да, тоже хороший вариант. только его дольше конфигить (поленился)
                  а findbugs практически не надо конфигить
                  Ответить
            • подумал, а лучше я таки ща экспортирую свои настройки и выложу в общий доступ - вдруг кому тоже понравится

              только сконфигю их как умолчания workspace, а то на работе они не умолчания - тут иной кодстайл
              Ответить
          • >final-переменные доступны в замыканиях анонимных классах.
            Это известно. Кто в здравом уме будет туда передавать исключение и главное зачем?
            >чтобы не присвоить случайно
            Так эксепшен же.
            Ответить
            • здесь эксепшен, а в общем случае полезно.
              Ответить
              • Да я понял. Но полностью разделяю мнение Романа ниже. Ненужные модификаторы - зло и засоряют код.
                Ответить
                • может быть
                  но я привык именно к такой настройке и мне комфортно.
                  Ответить
                  • Да не спорю. В подходе есть идея и он имеет право на жизнь.
                    >у меня автоматом this. ставятся, где возможно
                    Ну вот еще один типичный джавизм - чем больше говна символов, тем лучше проекту.
                    Ответить
                    • а причем тут джава? я бы сказал, что это пхп заставляет его использовать, чтобы обратиться к полям и методам
                      просто this. без всяких подсветок ясно говорит, что это поле или метод, причем ЭТОГО класса - не переменная и не параметр
                      Ответить
                      • Ну this заставляет вписывать скорее C++, а вот в Java то его зачем писать?
                        Ответить
                        • чтобы мне было спокойнее = )
                          Ответить
                          • >чтобы мне было спокойнее = )
                            Боитесь, что после долгой бессонной ночи или спросонья, перепутаете язык Java с С++ или PHP?
                            Ответить
                            • я тоже часто пишу this. после пятого языка лень вспоминать, где как нужно, проще писать везде this :)
                              Ответить
                            • не знаю, откуда у меня раздражение, когда я вижу обращение к полю\методу без this., пусть даже IDE подсвечивает правильно.
                              Ответить
                              • Короче я тут подумал.
                                И решил что Люр таки в чем-то глубоко прав.
                                final хоть и замусоривает код, но жабу лишним кейвордом не исправишь - всё равно многословное унылое говно.
                                А вот помочь обойти всякие грабли JMM вроде безопасных многопоточности и публикации объектов, это final может, да.

                                Собственно это созвучно посту Романа
                                >после пятого языка лень вспоминать, где как нужно
                                Чтобы не опубликовать недостроенный объект, например. То лень думать где в коде нужен этот final.
                                Ответить
                        • Да и в с++ никто не заставляет - мне вот, к примеру, нравится писать у полей префикс m_, поэтому они отличимы от параметров и локальных переменных и без this. Заодно подобное именование позволяет писать геттеры как field() а не getField().

                          А вызов метода текущего объекта без this можно спутать только с вызовом глобальной функции (которых в с++ не так уж и много, и, часто, перед ними стоит имя неймспейса) или с вызовом функции (или функтора), указатель на которую лежит в локальной переменной/параметре (но это встречается не на каждом шагу, и, в небольших методах, совсем не вносит путаницы).

                          Так что this для всех полей методов текущего объекта в с++ это скорее дело вкуса, или, возможно, требование корпоративного style guide, нежели необходимость.
                          Ответить
                          • если наследоваться от шаблона, то для доступа к наследству в строгих компиляторах c++ таки приходится писать this (как второй вариант - делать typedef на тип предка и квалифицировать через него, но это обычно больше символов)
                            Ответить
                            • Ну это, если я не ошибаюсь, только при наследовании шаблона от шаблона? Шаблон, унаследованный от класса, и класс, унаследованный, от шаблона эту проблему ведь не создают?

                              > как второй вариант - делать typedef на тип предка и квалифицировать через него, но это обычно больше символов
                              И, в добавок, не получится вызывать виртуальные методы...
                              Ответить
                              • да, при наследовании от template dependent типа

                                меня на первых порах вымораживало портировать отлаженный под студией код на gcc 3.x, сейчас смиренно расставляю this в нужных местах еще до компиляции
                                Ответить
                          • вот, m_ - это почти как this. вот только не люблю я такой_стиль.
                            Ответить
          • И не жалко вам вписывать 6 лишних символов в и без того непомерно длинные строки жабо-кода...
            Да, использую final, когда пишу иммутабельный класс или нужны аргументы в анонимных классах. В остальных же случаях, на мой взгляд, final лишь засоряет код, ухудшая читаемость. Но это дело вкуса, и тут можно поспорить.

            В Scala вон написать val также просто, как и var, поэтому можно использовать иммутабельность без вреда для читаемости, чем частенько и пользуюсь.
            Ответить
            • нет, не жалко. а еще у меня автоматом this. ставятся, где возможно
              Ответить
            • А я тоже ставлю по возможности val вместо final Тип.

              Потому что lombok.
              Ответить
              • А я тоже ставлю val вместо final Тип

                Потому что Scala
                Ответить
    • вот, как и обещал, мои настройки http://pastebin.com/97bYAkGx
      Ответить

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