Menu
Coddy logo textTech

初期化子リスト

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 12/110。

初期化子リスト(initializer list)は、コンストラクタにおいてコロンの後に続き、コンストラクタ本体の前に置かれるコードです。これはコンストラクタ本体が実行される前に実行され、インスタンス変数の初期化に使用されます。

以前のレッスンで、すでに初期化リストについて学習しました:

Point.origin() : x = 0, y = 0;

コロンの後の部分 (x = 0, y = 0) は初期化子リストです。複数の初期化はカンマで区切られます。

初期化子リストは、コンストラクタの本体が実行される前に値を設定する必要がある final 変数を扱う際に不可欠です:

class Circle {
  final double radius;
  final double area;

  Circle(double r)
      : radius = r,
        area = 3.14159 * r * r;
}

Circle c = Circle(5);
print(c.radius); // 5.0
print(c.area);   // 78.53975

初期化子リストは、コンストラクタの引数を代入する前に、それらに対して計算や変換を行うこともできます。これは、オブジェクトの生成時に値を導出したり、データを検証したりする必要がある場合に便利です。

省略記法の this. 構文を初期化子リストと組み合わせることができます:

class Rectangle {
  final double width;
  final double height;
  final double area;

  Rectangle(this.width, this.height)
      : area = width * height;
}

Rectangle rect = Rectangle(4, 5);
print(rect.area); // 20.0

ここでは、widthheight は簡略記法で割り当てられ、一方で area はそれらの値を使用して初期化子リスト内で計算されます。

challenge icon

チャレンジ

簡単

オブジェクトの作成時に初期化リストを使用して派生値を計算する、ボックス寸法計算機を作成しましょう。

コードを2つのファイルに整理します:

  • box.dart: 寸法と自動計算されるプロパティを持つ3Dボックスを表す Box クラスを定義します。クラスには以下を含める必要があります:
    • 3つの final double フィールド: lengthwidthheight
    • 2つの計算済み final double フィールド: volumesurfaceArea
    • this. 短縮形を使用して lengthwidthheight を受け取り、初期化リストを使用して volume (length × width × height) と surfaceArea (2 × (length×width + width×height + height×length)) を計算するコンストラクタ
    • ボックスの情報を表示する display() メソッド
  • main.dart: ボックスクラスをインポートし、2つのボックスを作成します:
    • 寸法が 3.04.05.0 のボックス
    • 寸法が 2.02.02.0 のボックス
    リストされた順序で各ボックスの display() を呼び出します。

display() メソッドは、以下の正確な形式で出力する必要があります:

Box: [length]x[width]x[height] | Volume: [volume] | Surface: [surfaceArea]

期待される出力:

Box: 3.0x4.0x5.0 | Volume: 60.0 | Surface: 94.0
Box: 2.0x2.0x2.0 | Volume: 8.0 | Surface: 24.0

チートシート

初期化リスト(initializer list)は、コンストラクタのコロンの後に続き、コンストラクタ本体の前に記述されるコードです。これはコンストラクタ本体が実行される前に実行され、インスタンス変数を初期化するために使用されます。

カンマで区切られた複数の初期化を伴う基本構文:

Point.origin() : x = 0, y = 0;

初期化リストは、コンストラクタ本体が実行される前に設定する必要がある final 変数にとって不可欠です:

class Circle {
  final double radius;
  final double area;

  Circle(double r)
      : radius = r,
        area = 3.14159 * r * r;
}

短縮形の this. 構文と初期化リストを組み合わせて、一部のフィールドを直接割り当て、他のフィールドを計算することができます:

class Rectangle {
  final double width;
  final double height;
  final double area;

  Rectangle(this.width, this.height)
      : area = width * height;
}

初期化リストは、コンストラクタの引数を割り当てる前に計算や変換を行うことができ、オブジェクト作成時に値を導出するのに役立ちます。

自分で試してみよう

import 'box.dart';

void main() {
  // TODO: 寸法 3.0, 4.0, 5.0 の box を作成する
  
  // TODO: 寸法 2.0, 2.0, 2.0 の box を作成する
  
  // TODO: 各 box に対して順番に display() を呼び出す
  
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン