2009-04-20 5 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

定数とすると、簡単にはできません。

これらのメンバーを持つクラスを作成し、セッターを保護する(またはコンストラクターから設定する)ゲッターメソッドを提供します。

もっと詳しく:

さて、で開始する彼らは、彼らが定義されている時に初期化されなければならないので、あなたは容易にデータベースから定数を初期化することはできません。

代わりに、このようなクラスの何かを作成する:あなたはクラスを構築とき、あなたはFEVER頭痛を設定し、今

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

を。静的なので、値は1つだけです。あなたはゲッターだけしか持っていないので、誰もそれをリセットすることはできません。彼らは最終的なので、誰もあなたの背後に継承で潜入することはできません。

+0

私は申し訳ありませんが、私はそれを取得していない。詳細を教えてください。 –

+1

@Charlie Martin:コンストラクタでstatic final定数を設定することはできません。代わりに静的イニシャライザを使用する必要があります。 –

+0

ありがとうございました。詳しい説明はありません。残念なことに、私はインターフェイスだけの作業をしなければならない。私たちは、アプリケーションの設計を変更する立場にはありません。それはすでに生きている。 これまでは、データベースから定数値を割り当てる必要はありませんでした。私たちはインターフェイスでそれらをハードコーディングしました。しかし今、彼らはデータベースからそれらを取得したい。 –

1

定数値はデータベース内に保持されるため、列挙型を作成して使用できるようにすることをお勧めします。

+0

インターフェイスがありませんか?実際には、アプリケーションが既に生きているので、アプリケーションの設計を変更する段階にはありません。インターフェースが存在し、インターフェースを損なうことなく解決する必要があります。 これまでのところ、データベースから定数値を割り当てる必要はありませんでした。私たちはインターフェイスでそれらをハードコーディングしました。しかし今、彼らはデータベースからそれらを取得したい。 提案が役に立ちます。 –

0

データソースに応じて異なるようにするには、そのためのデータ構造が必要です。

値(getters/settersを持つフィールド)を保持するBeanを定義したり、値のマップを使用したりできます。

おそらく、これは定数問題よりも構成上の問題のように考える必要があります。定数は実際にプログラミングの観点から意図されています。

1

本当に必要なのですか?

新しい病気を追加するときに新しいコードを追加する必要がある場合は、「定数」をデータ駆動の静的(非最終)グローバルにすることはほとんどありません。 (それだけで物事を複雑になります。)

  • データベースとコードの間のミスマッチを心配している場合は、そのデータベースを確認することができますし、アプリケーションの起動時定数が一致します。あなたは病気をテーブルに定義していて、何らかの参照整合性の権利を使用していますか?

  • データ駆動型のアプローチが必要と思われる場合は、「既知の病気」のフィールドはまったく必要ないはずです。コードは実際にそれらに依存すべきではないからです。その場合、各疾患は、同一性および他の特性を有する適切な対象でなければならない。

  • あなたはおそらく再び列挙に戻るべき特定の種類の特別な処理が必要な場合は...

  • あなたの代わりに、多くの疾患(つまり、動的に追加される可能性があります)と、わずか数タイプを持っている場合 - いくつかの病気は同じコードで同じように扱われます。病気の種類の列挙型(または定数)として疾患テーブルおよびコードに型を追加し、別の論理を実行するためにその型を使用します。

  • 各疾患に実際に複雑さが多い場合は、各疾患ごとに1つのクラスを作成することをお勧めします。 は(あなたは、サブクラスとすべてとの適切なO/Rのことを行うことができます...)

インタフェース列挙cludgeは、Java 5以降neccesaryではありません、あなたは両方の列挙型 を取得して行うことができますよう静的インポートが必要な場合。

(そして、列挙型を使用しているとき、あなたが自由のための列挙を取得して、データベースを検証することは簡単です。)

あなたのフィールドは、おそらく代わりに、巨大なグローバル定数クラスの疾患またはSickDudeと呼ばれるクラスに配置する必要があります。 (たとえば、Calendarのフィールドのように)。おそらく、彼らが所属するクラスの内部公開列挙型として。

関連する問題