静的コード ブロックを使用して、レジストリ内の一部のコントローラーを初期化しています。したがって、私の質問は、クラスが最初にロードされたときに、この静的コード ブロックが絶対に 1 回だけ呼び出されることを保証できますか? このコード ブロックがいつ呼び出されるかを保証できないことは理解しています。クラスローダーが最初にロードしたときだと思います。静的コード ブロック内のクラスで同期できることはわかっていますが、これは実際に起こることなのでしょうか?
簡単なコード例は次のとおりです。
class FooRegistry {
static {
//this code must only ever be called once
addController(new FooControllerImpl());
}
private static void addController(IFooController controller) {
// ...
}
}
または、これを行う必要があります。
class FooRegistry {
static {
synchronized(FooRegistry.class) {
addController(new FooControllerImpl());
}
}
private static void addController(IFooController controller) {
// ...
}
}