2009-04-20 4 views
2

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

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

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

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

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

+1

Используя интерфейс, как удобный держатель для констант является анти-модель. Существуют интерфейсы для определения поведения. См. «Эффективная Java», п. 19. –

+0

Спасибо. Но мы не в состоянии изменить дизайн приложения. Он уже жив. До сих пор не нужно было назначать значения констант из базы данных. Мы просто закодировали их в интерфейсе. Но теперь они хотят получить их из базы данных. Любые предложения полезны. Спасибо –

ответ

4

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

public interface IConstants { 
    public static final String FEVER = getConstFromDatabase("FEVER"); 
    public static final String HEADACHE = getConstFromDatabase("HEADACHE"); 
} 
+3

Итак ... рекомендую, чтобы загрузчик классов попал в базу данных. –

0

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

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

Подробнее:

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

Вместо этого создать класс что-то вроде этого:

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; } 
} 

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

+0

Прошу прощения, я не понял. Не могли бы вы быть более подробными? –

+1

@Charlie Martin: Вы не можете установить статическую конечную константу в конструкторе. Вместо этого вам придется использовать статический инициализатор. –

+0

Большое спасибо за подробное объяснение. К сожалению, мне приходится работать только с интерфейсом. Мы не в состоянии изменить дизайн приложения. Он уже жив. До сих пор не нужно было назначать значения констант из базы данных. Мы просто закодировали их в интерфейсе. Но теперь они хотят получить их из базы данных. –

1

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

+0

Вы имеете в виду отсутствие интерфейса? На самом деле мы не в состоянии изменить дизайн приложения, поскольку он уже жив. Интерфейс существует, и нам нужно найти интерфейс для поддержки решений. До сих пор не нужно было назначать значения констант из базы данных. Мы просто закодировали их в интерфейсе. Но теперь они хотят получить их из базы данных. Любые предложения полезны. –

0

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

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

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

1

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

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

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

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

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

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

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

Интерфейс перечисление cludge не neccesary поскольку Java 5, как вы можете получить как перечислений и сделать если вам нужно.

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

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