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

    +84

    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
    private enum FolderType{inbound, outbound, archive, rejected}
    
    private String inboundName = "inbound";
    private String outboundName = "outbound";
    private String archiveName = "archive";
    private String rejectedName = "rejected";
    
    // чуть ниже....
    private String getFolderTypeName(FolderType type){
        switch (type){
            case inbound:
                return inboundName;
            case outbound:
                return outboundName;
            case archive:
                return archiveName;
            case rejected:
                return rejectedName;
            default:
                throw new IllegalArgumentException(type.toString());
        }
    }

    Похоже, кто-то так и не въехал в жабьи енумы.

    Запостил: roman-kashitsyn, 12 Декабря 2011

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

    • В Java7 можно будет писать:
      private String getFolderTypeName(String type){
          switch (type){
              case inboundName:
                  return inboundName;
              case outboundName:
                  return outboundName;
              case archiveName:
                  return archiveName;
              case rejectedName:
                  return rejectedName;
              default:
                  throw new IllegalArgumentException(type.toString());
          }
      }
      Ответить
      • в java 7 можно и так писать:
        List<String> strings = new ArrayList<>();
        и вот так:
        try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data"))) {
            out.writeInt(666);
            out.writeUTF("Hello");
        }
        , только от этого почему-то не легче.
        Ответить
    • А как лучше, массивом или словарем? (только не говорите про type.toString() , а если что настроить придется...)
      Ответить
      • enum FolderType {
            inbound("inbound"), outbound("outbound"),
            archive("archive"), rejected("rejected");
        
            private String folderName;
            private FolderType(String folderName) {
                this.folderName = folderName;
            }
            public String getFolderName() { return folderName; }
        }

        Если нужно сконфигурить в рантайме (что в моём случае не подразумевается), то решение в топике сойдёт.
        Ответить
        • Интересно. В С# такого, кажется, нет.
          Ответить
          • да, в c# енумы сделаны в стиле C++.
            Ответить
            • Кто минусанул, поясни за что.
              Не держи знания в себе или чё у тебя там
              Ответить
              • Знания выливаются в текст. Тычки по красивым картинкам способна делать и ворона.
                Ответить
              • Минусанул я.
                Считаю некорректным енумы C# и C++ называть похожими. Разница между ними огромная. Этак можно выделение памяти в C++ и C# считать одинаковым: хули, оператор new и там, и там!

                Я бы прошёл мимо такого сообщения, лишь хмыкнув, если бы его сделал кто-то другой. Но Роман отличается хорошей аргументацией своего мнения, поэтому я счёл правильным обратить его внимание на полную несостоятельность данного поста.
                Ответить
                • Хорошо, аргументирую.
                  Схожесть енумов в C# и в C++ в том, что в конечном счёте они интерпретируются как целые числа. Из MSDN: "все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции".
                  В Java енумы кардинально отличаются. Там экземпляр перечисления - это финальный наследник абстракного класса. Енумы в Java могут реализовывать интерфейсы (но не могут расширять классы, поскольку в таком случае получается множественное наследование), содержать поля произвольных типов. Они нацелены на удобное и безопасное расширение вариантов числа вариантов без поломки функционала системы.

                  Т.е. в этом контексте енумы C# гораздо ближе по природе к енумам C++, чем к енумам Java.

                  Однако, изучая наработки .NET в плане енумов в версии 3.5 вынужден с вами согласиться. Действительно, в C# система перечислений сделала большой шаг в перёд по сравнению с C++-аналогами.
                  Сейчас ещё придёт defecate-cpp, ткнёт меня носом в буст и скажет, что я не знаю енумов C++
                  Ответить
                  • Принято. Согласен.

                    А я жду, что кто-нибудь из сиплюсистов начнёт рассказывать про достоинства enum из C++11. :)
                    Ответить
                  • Сейчас придет Тарас и скажет, что в Паскале, в отличии от Си, перечисления - это не просто intы.
                    И, например, чтобы взять следующий элемент перечисления недостаточно прибавить единицу.
                    Таки в Аде покруче будет http://en.wikibooks.org/wiki/Ada_Programming/Types/Enumeration
                    Ответить
                    • В паскале годные енумы, но алгебраические типы данных из функциональных языков всё равно круче.
                      Ответить
                  • с енумами в ++ у тебя всё в порядке - вплоть до с++03 енумы - лишь логическое объединение именованных целочисленных compile-time констант, чьи имена вылезают во внешнюю область видимости и на которые есть слабое ограничение "присваивать переменной типа enum (которая обычно какбе int - опции компилятора) можно только значения из этого enum"

                    в с++11 наконец то приняли давнее предложение осовременить это барахло

                    и таки да, в бусте кое-что есть для решения этих проблем, и даже для эмуляции
                    inbound("inbound"), outbound("outbound"),
                    archive("archive"), rejected("rejected"),
                    но оно даже не в основной ветке буста
                    в общем я конечно посмотрел, но не пользовался - т.к. в целом проблема олдскульных енумов малокритична
                    Ответить
          • Нечто похожее в шарпах можно через аттрибуты делать, но компактностью такой код "страдать" не будет.
            Ответить
        • В данном конкретном случае достаточно name() или toString().

          Для рантайма — EnumMap.
          Ответить
        • А зачем так? Я бы если такое увидел, то решил что имена и значения не совпадают :S Так имена продублированы безо всякой выгоды для дублирующего...
          Ответить
          • @Steve_Brown > (только не говорите про type.toString() , а если что настроить придется...)
            Ответить
            • Нет, в данном случае (предположим, строки не для интерфейса, а для лога или сериализации в XML), конечно, ToString() - самое то.
              Ответить
            • Недавно услышал аргумент от фаната Явы - "а если имплементация поменяется?". При детальном рассмотрении выяснилось что функция возвращала null.
              Ответить
              • т.е. имплементации не было
                Ответить
                • значит, она поменяется
                  Ответить
                • Нет, человек искренне верил в то, что имплементация null может поменятся. Ну мало ли, вдруг в Ява 7 null != null, или может методов каких добавятЪ.
                  Ответить
                  • >имплементация null может поменятся
                    Это паттернизм прочно засел в голову.
                    Ответить
                • Выше комментарий мой, и ошибка тоже :)
                  Ответить
              • На самом деле у нас в проекте очень нужна run-time реконфигурация: логика и жизненный цикл объектов приложения меняются в зависимости от выбранных продуктов. Можно было бы использовать мультиметоды (расширенные с произвольной функцией диспетчеризации, как в clojure), но в java их нет, там выручает Spring и интерфейсы со множеством реализаций.
                Ответить
    • показать все, что скрытоvanished
      Ответить

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