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

    +121

    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
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    public static boolean isAssignable(Class cls, Class toClass, boolean autoboxing) {
        if (toClass == null) {
            return false;
        }
        // have to check for null, as isAssignableFrom doesn't
        if (cls == null) {
            return !(toClass.isPrimitive());
        }
        //autoboxing:
        if (autoboxing) {
            if (cls.isPrimitive() && !toClass.isPrimitive()) {
                cls = primitiveToWrapper(cls);
                if (cls == null) {
                    return false;
                }
            }
            if (toClass.isPrimitive() && !cls.isPrimitive()) {
                cls = wrapperToPrimitive(cls);
                if (cls == null) {
                    return false;
                }
            }
        }
        if (cls.equals(toClass)) {
            return true;
        }
        if (cls.isPrimitive()) {
            if (toClass.isPrimitive() == false) {
                return false;
            }
            if (Integer.TYPE.equals(cls)) {
                return Long.TYPE.equals(toClass)
                    || Float.TYPE.equals(toClass)
                    || Double.TYPE.equals(toClass);
            }
            if (Long.TYPE.equals(cls)) {
                return Float.TYPE.equals(toClass)
                    || Double.TYPE.equals(toClass);
            }
            if (Boolean.TYPE.equals(cls)) {
                return false;
            }
            if (Double.TYPE.equals(cls)) {
                return false;
            }
            if (Float.TYPE.equals(cls)) {
                return Double.TYPE.equals(toClass);
            }
            if (Character.TYPE.equals(cls)) {
                return Integer.TYPE.equals(toClass)
                    || Long.TYPE.equals(toClass)
                    || Float.TYPE.equals(toClass)
                    || Double.TYPE.equals(toClass);
            }
            if (Short.TYPE.equals(cls)) {
                return Integer.TYPE.equals(toClass)
                    || Long.TYPE.equals(toClass)
                    || Float.TYPE.equals(toClass)
                    || Double.TYPE.equals(toClass);
            }
            if (Byte.TYPE.equals(cls)) {
                return Short.TYPE.equals(toClass)
                    || Integer.TYPE.equals(toClass)
                    || Long.TYPE.equals(toClass)
                    || Float.TYPE.equals(toClass)
                    || Double.TYPE.equals(toClass);
            }
            // should never get here
            return false;
        }
        return toClass.isAssignableFrom(cls);
    }

    org.apache.commons.lang.ClassUtils

    Запостил: 3.14159265, 01 Марта 2012

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

    • Вот решил глянуть как апачи проверяют приводимость классов.

      Я конечно всё понимаю, говно в либах вполне допустимо когда оно сделано для высшего блага, всеобщего счастья и удобства пользования.
      Но тут совсем непонятно зачем его так сверху и донизу пропитали ароматом субоптимальности и бульшыта.

      Метод приведен полностью, дабы не создавалось чувства вырванности из контекста.
      Ответить
      • и правильно, что полностью, иначе была бы совсем маленькая и невонючая кучка
        Ответить
      • Это из какого именно апачевского проекта?
        Ответить
      • Ага, commons-lang.

        На так апачевцы никогда не отличались особой элегантностью дизайна по сравнению, например, с Гуглом. Достаточно сравнить commons-lang и guava. Последняя вылизана - не подкопаешься. Less is more. В то время как commons-lang - свалка всего, чего можно.
        Ответить
        • в педивикии про гуано так и пишут: "Pisdium" redirects here.
          Ответить
    • Это как бы очень даж популярная библиотека, много где используется. Я с ней знаком через Флексовый СДК :)

      ПС. А в Яве никак по-другому не узнать, что класс является суперклассом другого? Типа isPrototypeOf()?
      Ответить
      • Это как бы и делает isAssignableFrom. Просто они расширили его ещё и на примитивные типы.
        Ответить

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