メソッドを持つ Enum
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 88/110。
Dartでは、enumは単なる定数のリストではありません。フィールド、コンストラクタ、メソッドを持つことができ、強力なミニクラスのように機能します。これはenhanced enumsと呼ばれ、各enum値に振る舞いやデータを直接持たせることができます。
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}
void main() {
var status = Status.pending;
print(status.displayName); // Waiting
print(status.isFinalized); // false
print(Status.approved.isFinalized); // true
}各enum値は、特定の引数を使用してコンストラクタを呼び出します。コンストラクタはconstである必要があり、すべてのフィールドはfinalである必要があります。enumのデータを使用したり、他の値と比較したりするゲッターやメソッドを追加できます。
拡張enumはインターフェースを実装することもでき、さらに柔軟性が高まります:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}
void main() {
var tasks = [Priority.high, Priority.low, Priority.medium];
tasks.sort();
print(tasks); // [Priority.low, Priority.medium, Priority.high]
}拡張 enum は、メッセージを伴うステータスコード、レベルを伴う優先度、座標を伴う方向のように、それぞれに関連付けられたデータや振る舞いを必要とする固定された値のセットがある場合に最適です。
チャレンジ
簡単拡張enum(enhanced enums)を使用してタスク管理システムを構築しましょう!タスクのカテゴリを表すenumを作成し、それぞれのカテゴリにプロパティと振る舞いを持たせることで、作業の整理と優先順位付けを支援します。
コードは2つのファイルに分けて構成します:
task_category.dart: プロジェクト内のさまざまなタスクタイプを表すTaskCategoryという拡張enumを作成します。各カテゴリには以下の要素を含めてください:- 人間が読みやすい名前のための
String labelフィールド int priorityフィールド(1が最高優先度、3が最低優先度)- 両方のフィールドを初期化する
constコンストラクタ - 4つのenum値:
bug(label: "Bug Fix", priority: 1)、feature(label: "New Feature", priority: 2)、documentation(label: "Documentation", priority: 3)、testing(label: "Testing", priority: 2) - 優先度が1の場合に
trueを返すゲッターisUrgent [label] (Priority: [priority])という形式の文字列を返すメソッドdescribe()
Comparable<TaskCategory>を実装してください。- 人間が読みやすい名前のための
main.dart: 作成したタスクカテゴリのenumをインポートし、その機能を実演します:feature、bug、documentation、testingの順に4つのタスクカテゴリすべてを含むリストを作成しますdescribe()メソッドを使用して、各カテゴリの説明を1行ずつ出力します- 空行を1行出力します
- リストを優先度順にソートし、
After sorting by priority:と出力します - ソートされた各カテゴリのラベルを1行ずつ出力します
- 空行を1行出力します
Urgent tasks:と出力します- 元の順序(
feature、bug、documentation、testing)でループを回し、isUrgentが true であるカテゴリのラベルのみを出力します
このチャレンジでは、フィールド、コンストラクタ、ゲッター、メソッド、そしてインターフェースの実装といった拡張enumの機能を組み合わせて、実用的なタスク分類システムを作成します!
期待される出力:
New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)
After sorting by priority:
Bug Fix
New Feature
Testing
Documentation
Urgent tasks:
Bug Fixチートシート
Dartの拡張enum(Enhanced enums)は、フィールド、コンストラクタ、メソッドを持つことができ、各enum値に振る舞いやデータを付加する強力なミニクラスとして機能します。
フィールドとコンストラクタを持つ基本的な拡張enumの例:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
}主な要件:
- コンストラクタは
constである必要があります - すべてのフィールドは
finalである必要があります - 各enum値は、特定の引数を使用してコンストラクタを呼び出します
拡張enumにはゲッターやメソッドを含めることができます:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}拡張enumは Comparable などのインターフェースを実装できます:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}固定された値のセットがあり、それぞれに関連するデータや振る舞いが必要な場合は、拡張enumを使用してください。
自分で試してみよう
import 'task_category.dart';
void main() {
// TODO: 次の順序で4つのタスクカテゴリすべてを含むリストを作成してください:
// feature, bug, documentation, testing
// TODO: describe() を使用して、各カテゴリの説明を1行に1つずつ出力してください
// TODO: 空行を出力してください
// TODO: リストを優先度(priority)でソートしてください
// TODO: "After sorting by priority:" と出力してください
// TODO: ソートされた各カテゴリのラベルを1行に1つずつ出力してください
// TODO: 空行を出力してください
// TODO: "Urgent tasks:" と出力してください
// TODO: 元の順序(feature, bug, documentation, testing)でループし、
// isUrgent が true のカテゴリのラベルのみを出力してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ13高度な OOP の概念
コンポジション vs 継承拡張メソッドCallable クラスSealed クラス (Dart 3)レコード (Dart 3)パターンとマッチング (3.0)メソッドを持つ Enum