Menu
Coddy logo textTech

メソッドを持つ 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 は、メッセージを伴うステータスコード、レベルを伴う優先度、座標を伴う方向のように、それぞれに関連付けられたデータや振る舞いを必要とする固定された値のセットがある場合に最適です。

challenge icon

チャレンジ

簡単

拡張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()
    また、タスクを優先度順にソートできるように(優先度番号が小さいものが先に来るように)、enumに Comparable<TaskCategory> を実装してください。
  • main.dart: 作成したタスクカテゴリのenumをインポートし、その機能を実演します:
    • featurebugdocumentationtesting の順に4つのタスクカテゴリすべてを含むリストを作成します
    • describe() メソッドを使用して、各カテゴリの説明を1行ずつ出力します
    • 空行を1行出力します
    • リストを優先度順にソートし、After sorting by priority: と出力します
    • ソートされた各カテゴリのラベルを1行ずつ出力します
    • 空行を1行出力します
    • Urgent tasks: と出力します
    • 元の順序(featurebugdocumentationtesting)でループを回し、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 のカテゴリのラベルのみを出力してください
}
quiz icon腕試し

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

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