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