Встроенный коррелированный подзапрос может выполнить работу:
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)
Вот простой пример:
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);
}
Enum
типы являются также отличным способом реализовать истинные одиночные элементы.
Классические шаблоны "одиночка" в Java обычно включают частных конструкторов и общедоступные статические методы фабрики, но все еще уязвимы для инстанцирования через отражение или (de-) сериализация. Перечислимый тип принимает меры против этого.
Я не совсем уверен, где заголовок вопроса согласуется с остальной частью его. Да, перечисления Java имеют поведение. У них может быть состояние также, хотя это должно действительно, действительно быть неизменное состояние. (Идея изменяемого перечисления значений является довольно страшным IMO.)
Перечисление в Java является фиксированным набором объектов в основном. Преимущество - то, что Вы знаете, что, если у Вас есть ссылка того типа, это всегда также null
или один из известного набора.
Лично я действительно люблю перечисления Java и жаль, что C# не имел их также - они намного более объектно-ориентированы, чем перечисления C#, которые в основном "называют числами". Существует несколько "глюков" с точки зрения порядка инициализации, но они являются обычно потрясающими.
Поскольку перечислимые экземпляры являются одиночными элементами, можно использовать их в switch
операторы или с ==
проверять равенство.
В основном перечисления Java являются классами (я не полагаю, что существует различие на уровне байт-кода), с дополнительной выгодой наличия известного зафиксированного набора возможных экземпляров и способности использовать их в операторах переключения.
Можно эмулировать "известный зафиксированный набор возможных экземпляров" с регулярными классами ("безопасный с точки зрения типов перечислимый" шаблон, описанный в бесчисленных книгах и статьях), но это - некоторая работа (повторенный для каждого такого класса), чтобы заставить это работать действительно правильно в отношении Сериализации, равняется () и хэш-код (), и возможно некоторые другие вещи, которые я забыл. Перечисления уровня языка экономят Вас та работа. И, как упомянуто выше, только перечисления уровня языка могут использоваться в операторах переключения.
В нашем проекте мы используем Перечисления для нескольких вещей, но возможно наиболее заметно в i18n целях - каждой части показанного текста дают Перечисление. Класс Enum имеет возвращающий Строку метод, который осматривает Локаль, которая используется и выбирает корректный перевод из набора переводов на времени выполнения.
Это служит двухцелевым - Вы получаете завершение кода от своего IDE и также никогда не забываете переводить строку.
Использование очень просто, до такой степени, что это почти rendundant для предоставления примера, но здесь - как можно было бы использовать перечисление перевода
System.out.println(Translations.GREET_PERSON.trans()+" "+user.getName());
Или, если Вы хотите быть необычными, иметь Перечисление, принимают аргументы, которые, с некоторой волшебной обработкой строк, будут вставлены в отмеченное положение в строке переводов
System.out.println(Translations.GREET_PERSON.trans(user.getName());