数年前、静的初期化子を使用してクラスレベルのセットアップ操作を呼び出していたことを覚えています。私はそれが非常に奇妙な行動をとっていたことを覚えています。上下の順番を間違えていたのか、初心者だったのか。しかし、私はそれらを再検討する必要性に直面しており、同様に簡潔なより良い方法がないことを確認したいと考えています.
ファッショナブルではないことはわかっていますが、データベースからインポートされたインスタンスの静的リストを保持するデータ駆動型クラスがよくあります。
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
}
このようなテーブル駆動型のクラスが何十もある場合、このパターンは非常に簡潔です (そうです、クラスとデータ/インスタンスの 1 つのソースが密接に結合されていることはわかっています)。
しかし、Google Guava の良さを発見したとき、EventBus を使用して、特定のイベントが投稿されたときに静的リストを更新したいと考えています。登録を初期化した静的メソッドを呼び出すためだけに、静的な最終ブール変数を作成します。
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private static final boolean subscribed = subscribe();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
private static boolean subscribe() {
MyEventBus.get().register(new Object() {
@Subscribe
public void refresh(ParameterRefreshEvent e) {
stratBands = importFromDb();
}
});
return true;
}
}
サブスクライブされた変数が使用されていないことに対してコンパイラが警告をスローするため、これはすぐに面倒になりました。また、混乱を招くだけです。したがって、静的イニシャライザを使用するのが適切かどうか疑問に思っています。これを 2 つ以上のクラスに分離しないと、本当に良い方法はありません。考え?
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
static {
MyEventBus.get().register(new Object() {
@Subscribe
public void refresh(ParameterRefreshEvent e) {
stratBands = importFromDb();
}
});
}
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
}