Jawa / Говнокод #14337 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 govnoacc, (Updated )

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

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

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

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8