LoginSignup
1
0

More than 1 year has passed since last update.

Dart(C#)のEnumを少しでもJava/Kotlinっぽい感じにしてやる

Last updated at Posted at 2021-12-24

更新 2022/05/24

先日 Dart2.17が発表され、その中で Enhanced enums としてEnumにフィールドやstaticメソッド等が実装できるようになりました。以後はそちらの方法が推奨されます。
参考:
https://medium.com/dartlang/dart-2-17-b216bfc80c5d

また、コメントにありました通りC#はアノテーションでフィールドを持つことが多いようなので、そちらが良いかと思われます。

以下Dart2.17発表前

JavaやKotlinを使っていると、Enumに値を持たせるという便利な機能が当たり前だと思うのですが、DartやC#のEnumではそれができません。
なので、Enumを拡張して擬似的に値を持てるようにしてやりました。同じ制約を持つC#もEnumの拡張ができるので、同様に書けると思います。
Dart 2.15です

void main() {
  for (var type in ArticleType.values) {
    print('${type.val.title} ${type.val.description}');
  }
}

/// Javaっぽくしたいenum
enum ArticleType {
  news, // ニュース
  sport, // スポーツ
  entertainment, // エンタメ
  fashion, // ファッション
  anime, // アニメ
}

/// Enumの値用のクラス
class Article {
  const Article({
    required this.title,
    required this.description,
  });

  final String title;
  final String description;
}

/// 拡張してEnumの値を持てるようにしてやる
extension ArticleTypeEx on ArticleType {
  Article get val {
    switch (this) {
      case ArticleType.news:
        return Article(title: 'ニュース', description: '最新のニュースです');
      case ArticleType.sport:
        return Article(title: 'スポーツ', description: 'スポーツのニュースです');
      case ArticleType.entertainment:
        return Article(title: 'エンタメ', description: '流行りのエンタメ情報です');
      case ArticleType.fashion:
        return Article(title: 'ファッション', description: 'トレンドファッションアイテム');
      case ArticleType.anime:
        return Article(title: 'アニメ', description: '今期覇権アニメです');
    }
  }
}

メリット

  • enumの値の定義が漏れた場合、コンパイルエラーとなり気づくことができる
  • フィールドを増やすたびに拡張を生やさなくていい。switch文はここだけで済む。保守しやすい
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0