静的初期化ブロック

静的初期化ブロックは、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 つだけです。
静的初期化ブロックの後に宣言されたフィールドは、ブロック内で使用できます。