Как лучше всего инициализировать константы из контекста базы данных или сервлета? - PullRequest
2 голосов
/ 20 апреля 2009

У нас есть константы, объявленные в интерфейсе нашего приложения, как это.

public interface IConstants
{
    public static final String FEVER="6";
    public static final String HEADACHE="8";
}

Теперь мы хотим заполнить значения этих констант (6 и 8) из базы данных (или контекста сервлета приложения).

Значения базы данных, хранящиеся в таблице поиска, уже доступны в сеансе приложения (в атрибуте контекста сервлета), и, следовательно, мне не нужно каждый раз совершать вызов базы данных.

Как нам это сделать?

Ответы [ 5 ]

4 голосов
/ 20 апреля 2009

Учитывая, что вы не хотите слишком сильно изменять существующий код, самый простой способ будет:

public interface IConstants {
    public static final String FEVER = getConstFromDatabase("FEVER");
    public static final String HEADACHE = getConstFromDatabase("HEADACHE");
}
1 голос
/ 20 апреля 2009

Вы уверены, что нужно?!

Если вам все равно нужно добавить новый код при добавлении нового заболевания, нет смысла делать «константы» статическими (не финальными) глобальными переменными, управляемыми данными. (Это просто усложнит ситуацию.)

  • Если вас беспокоит несоответствие между базой данных и кодом, вы можете проверить, что база данных и константы совпадают при запуске приложения. У вас есть заболевания, определенные в таблице, и вы используете какую-то ссылочную целостность, верно?

  • Если вы ДЕЙСТВИТЕЛЬНО думаете, что вам нужен подход, основанный на данных, вам, вероятно, вообще не понадобятся поля для «известных болезней», поскольку код не должен зависеть от них. В этом случае каждая болезнь должна быть надлежащим объектом с индивидуальностью и другими свойствами.

  • Если вам нужна специальная обработка для определенных типов, вам, вероятно, следует вернуться к перечислению ...

  • Если вместо этого у вас много болезней (которые могут быть добавлены динамически) и только несколько типов - несколько болезней обрабатываются одинаковым образом одним и тем же кодом; добавьте тип в таблицу болезней и в коде как перечисление (или константу) для типа болезни и используйте его для запуска другой логики.

  • Если каждая болезнь на самом деле имеет большую сложность, было бы неплохо попытаться написать один класс для каждой болезни. (Затем вы можете сделать правильную операцию O / R с подклассами и всем ...)

Переменная enum cludge не является необходимой начиная с Java 5, так как вы можете получить оба перечисления и сделайте статический импорт, если вам нужно.

(А при использовании enum проверка базы данных становится проще, поскольку вы получаете перечисление бесплатно.)

Ваши поля, вероятно, должны быть расположены в классе с именем Disease или SickDude вместо гигантского класса глобальных констант. (Как, например, поля в календаре). Возможно, как внутренний публичный список в классе, где они "принадлежат".

1 голос
/ 20 апреля 2009

Поскольку постоянные значения сохраняются в базе данных, наилучшим подходом будет создание типа enum и предоставление их через него.

0 голосов
/ 20 апреля 2009

Чтобы они различались в зависимости от источника данных, вам потребуется какая-то структура данных для них.

Вы можете определить bean-компонент для хранения значений (поля с получателями / установщиками) или использовать карту для значений.

Вероятно, вы должны думать об этом как о проблеме конфигурации, а не о константе. Константы действительно предназначены с точки зрения программирования.

0 голосов
/ 20 апреля 2009

Как константы , вы не можете с готовностью.

Создайте класс с этими членами, защитите сеттеры (или установите их из конструктора) и предоставьте методы получения.

Подробнее:

Хорошо, для начала, вы не можете легко инициализировать константы из базы данных, потому что они должны быть инициализированы во время их определения.

Вместо этого создайте класс примерно так:

public class Constants {
    private static final String FEVER ;
    private static final String HEADACHE ;

    public Constants(String fever, String headache){
        if(FEVER == null){
            FEVER = fever;
            HEADACHE = headache;
         } else {
            // Do something; shouldn't be resetting these.
         }
    }

    public String getFever(){ return FEVER; }
    public String getHeadache(){ return HEADACHE; }
}

Теперь, когда вы создаете класс, вы устанавливаете FEVER и HEADACHE. Поскольку они статичны, есть только одно значение; поскольку у вас есть только добытчики, и они являются частными, никто не может их сбросить; и так как они окончательны, никто не может прокрасться за твоей спиной с наследством.

...