静的初期化ブロックは、ECMAScript 2022 で標準化された新しい JavaScript 機能であり、最新のブラウザでのみサポートされています。静的初期化ブロックを使用すると、複数のステートメントにまたがるロジックを使用して、静的フィールドの値を動的に設定できます。
静的初期化ブロックを作成するには、static
キーワードの後に、中かっこ({}
)内のブロック ステートメントを使用します。
class MyClass {
static {}
}
このパターンでは、クラスの本体で宣言された静的フィールドを初期化または変更できます。
class MyClass {
static firstProperty = 'First property.';
static secondProperty;
static {
this.secondProperty = 'Second property.';
}
}
MyClass.secondProperty;
"Second property."
これらのステートメントは、constructor()
のように、クラスのインスタンスが作成されたときではなく、クラスが最初に初期化されるとき、つまり JavaScript エンジンが最初に評価するときに評価されます。
class MyClass {
static {
console.log( "Static initialization block." );
}
constructor() {
console.log( "Constructor." );
}
}
> "Static initialization block."
const myClassInstance = new MyClass();
> "Constructor."
クラスには複数の静的初期化ブロックを含めることができ、これらのブロックは他の静的フィールドやメソッドとともに宣言された順序で評価されます。つまり、静的初期化ブロックの前に宣言されたフィールドのみが、そのブロックで使用できます。
class MyClass {
static myNewField;
static {
this.myNewField = this.myField;
}
static myField = "My value.";
};
MyClass.myNewField;
> undefined
class MyCorrectedClass {
static myNewField;
static myField = "My value.";
static {
this.myNewField = this.myField;
}
};
MyCorrectedClass.myNewField;
> "My value."
理解度をチェックする
次の説明のうち正しいものはどれですか。
静的初期化ブロックは、クラスが最初に初期化されるときに評価されます。
1 つのクラスに含めることができる静的初期化ブロックは 1 つだけです。
静的初期化ブロックの後に宣言されたフィールドは、ブロック内で使用できます。