更新 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文はここだけで済む。保守しやすい