初期化子リスト
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ここでは、width と height は簡略記法で割り当てられ、一方で area はそれらの値を使用して初期化子リスト内で計算されます。
チャレンジ
簡単オブジェクトの作成時に初期化リストを使用して派生値を計算する、ボックス寸法計算機を作成しましょう。
コードを2つのファイルに整理します:
box.dart: 寸法と自動計算されるプロパティを持つ3Dボックスを表すBoxクラスを定義します。クラスには以下を含める必要があります:- 3つの
final doubleフィールド:length、width、height - 2つの計算済み
final doubleフィールド:volumeとsurfaceArea this.短縮形を使用してlength、width、heightを受け取り、初期化リストを使用してvolume(length × width × height) とsurfaceArea(2 × (length×width + width×height + height×length)) を計算するコンストラクタ- ボックスの情報を表示する
display()メソッド
- 3つの
main.dart: ボックスクラスをインポートし、2つのボックスを作成します:- 寸法が
3.0、4.0、5.0のボックス - 寸法が
2.0、2.0、2.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() を呼び出す
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ