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

    +73

    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
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    public enum Action {
    
        ADD, DELETE, UPDATE, REFRESH;
    
        public static Action getEnum(String value) {
            for (Action current : values()) {
                if (current.name().equalsIgnoreCase(value)) {
                    return current;
                }
            }
            throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
        }
    
        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    }
    
    public enum Manager {
    
        USER, ROLE, SERVICE;
    
        public static Manager getEnum(String value) {
            for (Manager current : values()) {
                if (current.name().equalsIgnoreCase(value)) {
                    return current;
                }
            }
            throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
        }
    
        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    
        public boolean isUser() {
            return this == USER;
        }
    
        public boolean isRole() {
            return this == ROLE;
        }
    
        public boolean isService() {
            return this == SERVICE ;
        }
    }
    
    public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
        @Override
        public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
            return new StringToEnumConverter<T>(targetType);
        }
    
        private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> {
    
            private Class<T> enumType;
    
            private StringToEnumConverter(Class<T> enumType) {
                this.enumType = enumType;
            }
    
            @Override
            public T convert(String source) {
                if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.manager")) {
                    return (T) Manager.getEnum(source);
                }
                if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.action")) {
                    return (T) Action.getEnum(source);
                }
                return (T) Enum.valueOf(this.enumType, source);
            }
        }
    }
    
    /* -- Mapping -- */
    @RequestMapping(value = "manage/index/{manager}/{action}", method = RequestMethod.GET)
    public String addValueToEntity(@PathVariable("manager") Manager manager, @PathVariable("action") Action action) {
    ...
    
    @RequestMapping(value = "/manage/index", method = RequestMethod.GET)
    public String indexPage(ModelMap model, @RequestParam(value = "manager", required = true) Manager manager) {
    ...

    Spring MVC. Проблема в том что строка lovercase а значения Enum-ов uppercase

    Запостил: govnoacc, 10 Января 2014

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

    • tldr
      Ответить
    • Это кстати какая-то общая проблема пользователей МВЦ Спринга: любовь к инумераторам. Т.е. пофиг, что с ними работать неудобно, что статические поля (которыми по-сути и являются эти инумераторы) очень пагубно влияют на распраллеливание, сериализацию, как в сторону клиента, так и в сторону базы данных, но тем не менее, в любом уважающем себя проекте на каждый серьезный класс по инуму.
      Ответить
      • > распраллеливание
        А что с распараллеливанием? Они ж final. И сами по себе вроде иммутабельные. Не должно мешать...
        Ответить
        • А что javac сможет доказать, что методы членов инумератора не меняют глобальное состояние, т.е. что они reentrant? Чет я сильно сомневаюсь.
          Ответить
          • > доказать, что методы членов инумератора не меняют глобальное состояние
            А это уже личная проблема того, кто эти методы туда добавил. Все стандартные методы инума (toString, valueOf, и т.п.) - реентерабельны, т.к. не меняют никакого состояния (да его и не изменишь, там все final).

            И никаких блокировок и volatile жаба сама по себе добавлять не будет.
            Ответить
            • И даже ошибок не бросают? Как-то не по-явовски...
              Ответить
              • > И даже ошибок не бросают?
                IllegalArgumentException в valueOf() разве что, если ей туда передать что-то, чего нет в enum'е.

                Ну а вообще, никто не мешает добавить своих полей, методов, и превратить свое перечисление в нереентерабельное говно, кидающее ошибки на каждый чих :)
                Ответить
                • Ну вот тут можно предательски обработать ошибку, класслоадером выгрузить имеющийся инум, загрузить другой с таким же именем, в то время как в другом треде кто-то пытается перечислить все элементы инумератора...
                  Ответить
                  • > класслоадером выгрузить имеющийся инум
                    > другом треде кто-то пытается перечислить все элементы инумератора
                    Класслоадеры не выгружаются, пока хоть один объект из этого класслоадера кому-то нужен. Так что другой тред спокойно дочитает все элементы ;)

                    P.S. Кстати енумы из разных класслоадеров несравнимы. Даже если их загрузили из одного .class файлика.
                    Ответить
            • Я вот сегодня для себя отркыл зачем инумераторы нужны. Оказывается в хайбернейте нет возможности создать таблицу с уже заполнеными данными, ну или эта возможность где-то очень глубоко похоронена. А вот инумы как раз таки хайбернейтом и используются для таких задач. Вот их и используют по делу и не по делу.
              Т.е. это в чем-то упрощает жизнь писателям хайбернейт приложений в том, что им не нужно писать деплой скрипты - хайбернейт за них все сделает, но вот я бы не назвал это качественной работой.
              Ответить
    • > lovercase
      Это что еще за чемодан любовника?
      Ответить
      • Чемодан для любовника
        Ответить
      • По Фрейду.
        Ответить
      • В нем автор топика держит своего любовника, чтобы не брать за него билет.
        он не учел таксу на багаж
        Ответить

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