問題タブ [static-initializer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 静的初期化コード ブロックと非静的初期化コード ブロックの違いは何ですか
私の質問は、 static キーワードの特定の使用法に関するものです。キーワードを使用static
して、どの関数にも属さないクラス内のコード ブロックをカバーすることができます。たとえば、次のコードはコンパイルされます。
キーワードを削除するstatic
と、変数a
がfinal
. final
ただし、キーワードとキーワードの両方を削除しstatic
てコンパイルすることは可能です。
両方の点で私を混乱させます。どのメソッドにも属さないコード セクションを作成するにはどうすればよいですか? それをどのように呼び出すことができますか?一般的に、この使用の目的は何ですか? または、これに関するドキュメントはどこにありますか?
java - 静的初期化子を再度呼び出す
クラスがロードされたら、静的初期化子を再度呼び出す方法はありますか?
編集:
元のクラスを記述しておらず、呼び出す必要があるロジックが静的初期化子に実装されているため、静的初期化子を呼び出す必要があります。
java - Java で静的初期化子が実行される順序を保証できますか?
私は Set クラスを持っています (これは J2ME なので、標準 API へのアクセスは制限されています。私の明白な車輪の再発明を説明するためです)。セットクラスを使用して、クラスとサブクラスで定数セットを作成しています。なんかこんな感じ…
[1] の行でヌル ポインター例外が発生することを除いて、すべて問題ないように見えます。おそらくこれは、サブクラスの静的イニシャライザーが親クラスの前に実行されていることを意味します。インスタンス化されたサブクラスで実行する前に、最初に新しいインポートで静的ブロックを実行すると思っていたので、これは私を驚かせました。
私はこの仮定で正しいですか?この動作を制御または回避する方法はありますか?
アップデート:
物事はさらに奇妙です。代わりにこれを試しました(「new ParentClass()」行に注意してください):
そして出力は奇妙です:
したがって、ParentClass は初期化されますが、サブクラスはその静的初期化子でそれにアクセスできません。
java - Java での初期化子とコンストラクターの使用
そのため、最近 Java のスキルを磨いていて、以前は知らなかった機能をいくつか発見しました。静的およびインスタンス初期化子は、そのような 2 つの手法です。
私の質問は、コンストラクターにコードを含める代わりに、いつイニシャライザーを使用するのですか? 私はいくつかの明白な可能性を考えました:
静的/インスタンス初期化子を使用して、「最終的な」静的/インスタンス変数の値を設定できますが、コンストラクターはできません
静的初期化子を使用して、クラス内の任意の静的変数の値を設定できます。これは、各コンストラクターの先頭に「if (someStaticVar == null) // do stuff」コード ブロックを配置するよりも効率的です。
これらのケースは両方とも、これらの変数を設定するために必要なコードが単純な「var = value」よりも複雑であると想定しています。そうでない場合、変数を宣言するときに単に値を設定する代わりに初期化子を使用する理由がないように思われます。
ただし、これらは些細な利点 (特に最終変数を設定する機能) ではありませんが、初期化子を使用する必要がある状況はかなり限られているようです。
確かに、コンストラクターで行われる多くのことに対して初期化子を使用できますが、そうする理由は本当にわかりません。クラスのすべてのコンストラクターが大量のコードを共有している場合でも、プライベートな initialize() 関数を使用する方が、初期化子を使用するよりも理にかなっているように思えます。コンストラクタ。
何か不足していますか?イニシャライザを使用する必要がある状況は他にもたくさんありますか? それとも、非常に特定の状況で使用するためのかなり限定的なツールですか?
java - Java静的初期化子はスレッドセーフですか?
静的コード ブロックを使用して、レジストリ内の一部のコントローラーを初期化しています。したがって、私の質問は、クラスが最初にロードされたときに、この静的コード ブロックが絶対に 1 回だけ呼び出されることを保証できますか? このコード ブロックがいつ呼び出されるかを保証できないことは理解しています。クラスローダーが最初にロードしたときだと思います。静的コード ブロック内のクラスで同期できることはわかっていますが、これは実際に起こることなのでしょうか?
簡単なコード例は次のとおりです。
または、これを行う必要があります。
.net - 静的初期化子とスレッド同期 (.NET)
静的初期化子は、クラスへの最初の参照の前に 1 回実行されることになっています。これは、クラスがアクセスされるたびに、クラスの静的初期化子が実行されているかどうかをチェックする必要があることを意味します。
マルチスレッド環境では、クラスが複数のスレッドによってアクセスされるときに同期が必要になるため、非自明な静的初期化子を持つクラスが競合の原因になる可能性があるようです。
私の質問は、静的初期化子によって導入されたクラス定義に対するそのような暗黙的なロックの影響を最小限に抑える最善の方法は何ですか?
java - main(...) は、疑似エントリポイントとして static-initializer を使用することよりもどのような利点を提供しますか?
Java のプログラムへのエントリ ポイントは通常、次のようなものです。
ただ、mainにSOPが一つしかないので、上記のクラスは代わりにこうなるかもしれません
main(...) を使用する明らかな利点の 1 つは、引数をプログラムに渡すことができることです。もう1つ(ここでは推測しています)は、静的ブロック内で作成されたオブジェクトを別の方法で処理するガベージコレクターに関係している可能性があります。
静的初期化子を使用する代わりに、言語定義のエントリ ポイント public static void main( String args[] ) を使用すると、他にどのような利点がありますか。
ps 上記のスニペットは説明のみを目的としており、コンパイルできない場合があります
php - PHP の静的初期化子の不足を補うにはどうすればよいですか?
すべてのクラスを別のファイルに入れ、クラス定義の外で静的初期化を行うことを考えています。
これに関する問題は、前述のクラスが実際に必要になる前に初期化が行われるという事実です (クラスを含むファイルが初めてインクルードされるときに発生します)。クラスがまったく使用されない可能性があるため、初期化が不要になる可能性があるため、これは問題です。そして、コードの先頭にない使用済みファイルを含めるという慣行は、単に汚いテクニックだと思います。
誰かがこの問題に対する実行可能な解決策を持っているなら、私はそれを大いに感謝します.
c# - 静的クラスの静的フィールドの初期化順序
次のコードが与えられた場合:
その長さを使用してに割り当てる前myChars
に、が初期化されることが保証されていますか?myCharsSize
java - Java:static {}とは何ですか?
誰かが私に次のことを説明できますか?
この静的な{...}は何をしますか?
C ++の静的変数について知っていますが、それは静的ブロックか何かですか?
このようなものはいつ実行されますか?