0

私は Java を学びながら libgdx に慣れるためにいくつかのチュートリアルに従っていましたが、興味をそそられたクラスでこのコードを見つけました。

    static Map<Keys, Boolean> keys = new HashMap<Keys, Boolean>();
static {
    keys.put(Keys.LEFT, false);
    keys.put(Keys.RIGHT, false);
    keys.put(Keys.JUMP, false);
    keys.put(Keys.FIRE, false);
};

これの機能はほとんど無視できます。Keys は列挙型であり、それ以外はすべて自明です。奇妙なことに、このコードはメソッドの外側にあり、実際にはその静的な {} ブロックは何らかのメソッドとして宣言されています。

それで、これは何ですか?それは何をするためのものか?クラスの作成時にそのコードを実行しますか? それとも、プログラムが最初に実行されたときですか? (結局のところ静的です)。この種の (呼びましょう) メソッドが何であるか、名前がある場合、およびこれを使用してどのような制限があるかを知りたいだけです。また、これを使用するか回避するかについて、ある程度の効率性、または良い実践のアドバイスを求めたいと思います。

どうもありがとうございました。

4

3 に答える 3

2

それで、これは何ですか?

これは静的初期化ブロックです。言語仕様の8.7も参照してください。

それは何をするためのものか?

クラス変数の初期化に使用されます。

クラスの作成時にそのコードを実行しますか?

クラスが初期化されるとき。それが発生するタイミングの詳細については、言語仕様の 12.4.1 を参照てください

それとも、プログラムが最初に実行されたときですか?

必ずしも。必要になる直前に行われますが、プログラム実行の他の時点まで行われない可能性があります。繰り返しますが、仕様を参照してください。

この種の (呼びましょう) メソッドが何であるか、名前がある場合、およびこれを使用してどのような制限があるかを知りたいだけです。

クラス変数の初期化に使用される特別なメソッドですこれは「静的初期化子」と呼ばれます。制限事項は、仕様書でかなり詳しく説明されています。

また、これを使用するか回避するかについて、ある程度の効率性、または優れた実践的なアドバイスを求めたいと思います。

これらは、サンプル コードのようにクラス変数を初期化する必要がある特定の状況で役立ちます。静的イニシャライザの適切な使用方法だと思います。

于 2013-07-16T15:44:58.287 に答える
0

これは静的初期化子です。クラスがロードされたときに実行されます(正確には初期化されますが、通常は違いに気づきません)。

これは「クラス コンストラクター」と考えることができます。

キーワードがないことを除いて、同じように見えるインスタンス初期化子もあります。staticこれらは、オブジェクトの新しいインスタンスが作成されるときに、コンストラクターのコードに加えて実行されます。

回答元:こちら

于 2013-07-16T15:43:12.477 に答える