Перечисления Java могут иметь поведение?

Встроенный коррелированный подзапрос может выполнить работу:

UPDATE base_table b
SET b.amount =
    b.amount 
    + NVL(
        (SELECT SUM(DECODE(t.txn_type, 'Credit', 1, -1) * t.amount)
        FROM txn_table t
        WHERE t.person = b.person
    ), 0)
14
задан Dave 7 April 2009 в 14:51
поделиться

6 ответов

Вот простой пример:

enum RoundingMode {
    UP {
        public double round(double d) {
            return Math.ceil(d);
        }
    },
    DOWN {
        public double round(double d) {
            return Math.floor(d);
        }
    };

    public abstract double round(double d);
}
17
ответ дан 1 December 2019 в 07:13
поделиться

Enum типы являются также отличным способом реализовать истинные одиночные элементы.

Классические шаблоны "одиночка" в Java обычно включают частных конструкторов и общедоступные статические методы фабрики, но все еще уязвимы для инстанцирования через отражение или (de-) сериализация. Перечислимый тип принимает меры против этого.

9
ответ дан 1 December 2019 в 07:13
поделиться

Я не совсем уверен, где заголовок вопроса согласуется с остальной частью его. Да, перечисления Java имеют поведение. У них может быть состояние также, хотя это должно действительно, действительно быть неизменное состояние. (Идея изменяемого перечисления значений является довольно страшным IMO.)

Перечисление в Java является фиксированным набором объектов в основном. Преимущество - то, что Вы знаете, что, если у Вас есть ссылка того типа, это всегда также null или один из известного набора.

Лично я действительно люблю перечисления Java и жаль, что C# не имел их также - они намного более объектно-ориентированы, чем перечисления C#, которые в основном "называют числами". Существует несколько "глюков" с точки зрения порядка инициализации, но они являются обычно потрясающими.

7
ответ дан 1 December 2019 в 07:13
поделиться

Поскольку перечислимые экземпляры являются одиночными элементами, можно использовать их в switch операторы или с == проверять равенство.

2
ответ дан 1 December 2019 в 07:13
поделиться

В основном перечисления Java являются классами (я не полагаю, что существует различие на уровне байт-кода), с дополнительной выгодой наличия известного зафиксированного набора возможных экземпляров и способности использовать их в операторах переключения.

Можно эмулировать "известный зафиксированный набор возможных экземпляров" с регулярными классами ("безопасный с точки зрения типов перечислимый" шаблон, описанный в бесчисленных книгах и статьях), но это - некоторая работа (повторенный для каждого такого класса), чтобы заставить это работать действительно правильно в отношении Сериализации, равняется () и хэш-код (), и возможно некоторые другие вещи, которые я забыл. Перечисления уровня языка экономят Вас та работа. И, как упомянуто выше, только перечисления уровня языка могут использоваться в операторах переключения.

2
ответ дан 1 December 2019 в 07:13
поделиться

В нашем проекте мы используем Перечисления для нескольких вещей, но возможно наиболее заметно в i18n целях - каждой части показанного текста дают Перечисление. Класс Enum имеет возвращающий Строку метод, который осматривает Локаль, которая используется и выбирает корректный перевод из набора переводов на времени выполнения.

Это служит двухцелевым - Вы получаете завершение кода от своего IDE и также никогда не забываете переводить строку.

Использование очень просто, до такой степени, что это почти rendundant для предоставления примера, но здесь - как можно было бы использовать перечисление перевода

System.out.println(Translations.GREET_PERSON.trans()+" "+user.getName());

Или, если Вы хотите быть необычными, иметь Перечисление, принимают аргументы, которые, с некоторой волшебной обработкой строк, будут вставлены в отмеченное положение в строке переводов

System.out.println(Translations.GREET_PERSON.trans(user.getName());
1
ответ дан 1 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: