問題タブ [static-initialization]
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 - 静的初期化子で静的最終フィールドを初期化してもコンパイル時定数が得られない (Java)
サーブレットでアノテーション @MultipartConfig(location=Test.MY_CONST) を使用しようとしています。
以下のコード 1を使用すると、問題なく動作します。以下のコード 2を使用すると、コンパイル時に次の出力が得られます。
エラー: 属性値は定数でなければなりません
@MultipartConfig(location=Test.MY_CONST)
コード 1
コード 2
質問: 「ここで何が起こっているのですか?」 という質問がいくつかあります。
- Code 1とCode 2の違いは何ですか?
- @MultipartConfig にはコンパイル時定数が必要
MY_CONST
であり、静的初期化子でコンパイル時定数を割り当ててもコンパイル時定数が作成されないためMY_CONST
、このエラーが発生しますか? - コード 2
System.out.println(Test.MY_CONST)
の場合、リフレクションで の値を変更すると、によって何が出力されますか?MY_CONST
c++ - 静的初期化順序がまだ指定されていないのはなぜですか?
コンパイラは、すべてのグローバルの依存関係ツリーを生成し、明確に定義された正しい初期化順序を作成するために必要なすべての情報を持っていませんか? グローバルで循環依存関係を記述できることを認識しています-そのケースのみを未定義の動作にします-コンパイラは警告し、それについてエラーになる可能性があります。
通常、この種のことの理由は、コンパイラ作成者にとって負担になるか、コンパイルが大幅に遅くなる可能性があるためです。この場合、これらのいずれかが真実ではないことを示す測定基準や証拠はありませんが、どちらも真実ではないというのが私の傾向です。
java - 静的ブロックでチェックされた例外をチェックされていない例外に変換するのは標準/推奨される方法ですか?
静的ブロックはチェックされた例外をスローできませんが、チェックされた例外がチェックされずに変換され、静的ブロックからスローされるコードをいくつか見てきました。その一例は、辞書のテキスト ファイルを読み取ることです。辞書の半分だけを読みたくないので、例外をキャッチする代わりにスローするのが理にかなっています。しかし、私の質問は、それは単なるハックなのか、それとも業界全体で一般的に採用されているコーディング スタイルなのかということです。
c++ - 間接再帰、従属静的変数
次の間接再帰の結果は標準で定義されていますか、それとも未定義の動作ですか?
VS2012 ではtmp は 5ですが、それが標準で保証されているかどうかはわかりません。
java - JUnit: 静的最終属性の初期化
多くの場合、単体テストでは、リソース ファイルから読み込まれ、テスト クラスの静的属性に格納されるフィクスチャがあります。
これは機能しますが、私が抱えている問題は、あるテストケースが別のテストケースの出力に影響を与える可能性があるため、テストで非最終的な静的データを一般的に好まないことです (上記の例では、1 つのテストが再割り当てされた場合fileContents
)フィクスチャ データを使用する他のテストで副作用が発生する可能性があります)。
ただし、最終修飾子を追加すると、宣言時に代入が発生する必要があります。これは、初期化が自明でない場合に問題になります (上記の例のように、初期化コードによってチェック済み例外がトリガーされる可能性があります)。別の方法は、静的初期化ブロックを使用することです。
しかし、try/catch を書かなければならないという冗長さのため、私はこのアプローチが特に好きではありません。
どちらのアプローチがより一般的/慣用的なJavaですか?または静的な最終リソースを初期化するためのより良い/より典型的な方法はありますか?
java - インターフェイスでの静的初期化
私がこのようなものを書き込もうとしたとき:
コンパイラはそれをコンパイルできませんでした。
しかし、私がこのようなことを書いたとき:
それを逆コンパイルすると、静的な初期化が見られました:
この振る舞いを説明していただけますか?
java - 静的初期化
コードをコンパイルするときに問題が発生しています。コードをコンパイルすると、クラス foo で foo2.var が null を返しますが、その理由がわかりません。foo2 クラスで foo2.var を null にするために foo2 クラスで静的初期化を行う方法に何か問題がありますか?
どんな助けでも大歓迎です。
この例では、foo2.var 行にヌル ポインター エラーがあります。