定数コンストラクタ
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 13/110。
定数コンストラクタは、コンパイル時定数オブジェクトを作成します。同じ値を持つオブジェクトを const コンストラクタを使用して作成すると、Dart はメモリ内の同じインスタンスを再利用し、パフォーマンスを向上させます。
定数コンストラクタを作成するには、コンストラクタ名の前に const キーワードを追加し、すべてのインスタンス変数が final であることを確認します:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // truewhite と alsoWhite はどちらも、定数コンストラクタを使用して同一の値で作成されたため、メモリ内のまったく同じオブジェクトを指します。
const キーワードを使わずに const コンストラクタを使用することもできます。その場合、通常の(定数ではない)インスタンスが作成されます:
var red = Color(255, 0, 0); // 通常のインスタンス
const blue = Color(0, 0, 255); // 定数インスタンス定数コンストラクタは、不変の構成オブジェクト、色やサイズのような定義済みの値、そしてメモリ使用量を最適化しながらオブジェクトの不変性を保証したいあらゆる場所で一般的に使用されます。
チャレンジ
簡単不変で再利用可能な設定を定義するために、定数コンストラクタを使用したシンプルなゲームの設定システムを構築しましょう。
コードを整理するために、2つのファイルを作成します:
difficulty.dart: ゲームの難易度設定を表すDifficultyクラスを定義します。クラスには以下を含める必要があります:- 3つの
finalフィールド:name(String)、enemyCount(int)、playerLives(int) - これら3つのフィールドすべてを初期化する定数コンストラクタ
- 難易度情報を表示する
display()メソッド
- 3つの
main.dart: 難易度クラスをインポートし、3つの定数難易度プリセットを作成します:easy:名前は'Easy'、敵の数は5、ライフは5medium:名前は'Medium'、敵の数は10、ライフは3hard:名前は'Hard'、敵の数は20、ライフは1
constキーワードを使用して、これら3つすべてをコンパイル時定数として作成してください。次に、上記の順序でそれぞれに対してdisplay()を呼び出します。最後に、identical()を使用して2つのconst Difficulty('Easy', 5, 5)オブジェクトが同一であるかどうかを確認し、その結果を出力してください。
display() メソッドは、以下の形式で正確に出力する必要があります:
[name]: [enemyCount] enemies, [playerLives] lives期待される出力:
Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
trueチートシート
定数コンストラクタは、コンパイル時定数オブジェクトを作成します。同一の値を持つオブジェクトが const コンストラクタを使用して作成されると、Dart はメモリ内の同じインスタンスを再利用します。
定数コンストラクタを作成するには、コンストラクタ名の前に const キーワードを追加し、すべてのインスタンス変数が final であることを確認します:
class Color {
final int red;
final int green;
final int blue;
const Color(this.red, this.green, this.blue);
}同一の値を持つ定数インスタンスを作成すると、メモリ内の同じオブジェクトになります:
const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);
print(identical(white, alsoWhite)); // trueConst コンストラクタは、const キーワードなしで使用して、通常のインスタンスを作成することもできます:
var red = Color(255, 0, 0); // 通常のインスタンス
const blue = Color(0, 0, 255); // 定数インスタンス定数コンストラクタは、不変の構成オブジェクト、定義済みの値、およびメモリ使用量の最適化に役立ちます。
自分で試してみよう
import 'difficulty.dart';
void main() {
// TODO: constキーワードを使用して、3つの定数難易度プリセットを作成してください:
// - easy: 名前 'Easy'、敵 5体、ライフ 5
// - medium: 名前 'Medium'、敵 10体、ライフ 3
// - hard: 名前 'Hard'、敵 20体、ライフ 1
// TODO: 各難易度に対して、easy、medium、hardの順にdisplay()を呼び出してください
// TODO: 2つの const Difficulty('Easy', 5, 5) オブジェクトが同一であるかどうかを
// identical() を使用してチェックし、その結果をプリントしてください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ