1

次のようなクラスがあるとします

public class Foo
{
     public static final String FIELD_1 = Env.getProperties("one");
     public static final String FIELD_2 = Env.getProperties("one");

     //....
     public static final String FIELD_N = Env.getProperties("n");
}

明らかに、FIELD_*最初に を参照したときにすべてが読み込まれますFoo。my が純粋に機能的ではないと仮定しEnv.getProperties(String)ます (つまり、異なる値を返す可能性があります。どのように? ここでは重要ではありません)

Fooすべてのクラス初期化コードが再実行されるように、クラスを強制的に「リロード」するにはどうすればよいですか(静的フィールドに異なる値を設定できるようにするためです)。

(さまざまな理由から、これらのフィールドを非静的または非最終的なものにすることはできません。そのため、さまざまな getter メソッドをオーバーライドして Foo をインターフェイスにするなどの解決策を提案しないでください)

ありがとう

4

1 に答える 1

1

それをしないでください!

カスタム クラスローダーまたは JRebel を使用して実行できる場合もありますが、非常に面倒です。異なるクラスは、これらのフィールドから異なる値を読み取り、互いに同期していない可能性があります。

定数は定数であると想定されています。最小の驚きの原則に従い、より良い設計にリファクタリングします。


最小限のリファクタリングの提案

フィールドの名前が合理的に適切である場合FIELD_1(など)、すべての Java ファイル内のフィールドへの参照を検索して、FIELD_2で置き換えることができる場合があります。次に、定数を静的メソッドに置き換えるコードをいくつか記述します。FIELD_1()FIELD_2()

public static String FIELD_1() { return Env.getProperties("one"); }
public static String FIELD_2() { return Env.getProperties("two"); }
//etc.

少し醜いですが、本当のハックに頼ることなく、行きたい場所にたどり着くことができます.

于 2013-12-16T19:26:59.607 に答える