タグ付けされた質問 「static-initializer」

8
静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか
私の質問は、静的キーワードの特定の使用法についてです。staticキーワードを使用して、どの関数にも属していないクラス内のコードブロックをカバーすることができます。たとえば、次のコードはコンパイルします。 public class Test { private static final int a; static { a = 5; doSomething(a); } private static int doSomething(int x) { return (x+5); } } staticキーワードを削除すると、変数aがであるため文句が表示されfinalます。ただしfinal、staticキーワードとキーワードの両方を削除してコンパイルすることは可能です。 どちらの面でも混乱します。どのメソッドにも属さないコードセクションをどのように持つべきですか?それを呼び出すにはどうすればよいですか?一般的に、この使用法の目的は何ですか?または、これに関するドキュメントはどこにありますか?

6
Java静的初期化子はスレッドセーフですか?
静的コードブロックを使用して、レジストリ内のいくつかのコントローラーを初期化しています。したがって、私の質問は、クラスが最初にロードされたときに、この静的コードブロックが絶対に一度だけ呼び出されることを保証できますか?このコードブロックがいつ呼び出されるかは保証できないことを理解しています。Classloaderが最初にそれをロードしたときに、それを推測しています。静的コードブロックのクラスで同期できることはわかっていますが、これは実際に何が起きているのでしょうか。 簡単なコード例は次のようになります。 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) { // ... } }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.