🤔
Dart2.17で追加された拡張enumを試す
はじめに
Dart2.17 から enum の機能が拡張されたようなので、使い方を試してみようと思います。
SDK バージョンの下限を 2.17.0 以上に
「さあ、はじめよう。」と思ったらいきなりエラー出ましたね。
SDK バージョンの下限が2.15.0
になってました。
This requires the 'enhanced-enums' language feature to be enabled. Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17.0 or higher, and running 'pub get'.
pubspec.yaml
のenvironment
部分を更新します。
pubspec.yaml
environment:
sdk: ">=2.17.0 <3.0.0"
中身を見てみる
参考の medium の記事で紹介されている例を使っていきます。
主な追加機能
- enum にコンストラクタを追加できるようになった(state を持てるようになった)
- toString()をオーバーライドできるようになった
enum のそれぞれの要素毎にコンストラクタを初期化できる。
enum Water {
frozen(32),
lukewarm(100),
boiling(212);
final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
String toString() => "The $name water is $tempInFahrenheit F.";
}
ちなみに$name
のname
は Dart の 2.15 から追加されている機能ですね。
final w = Water.frozen;
print(w.name); //frozen
toString()を使ってみる
この状態で print してみると、
print(Water.frozen); //The frozen water is 32 F.
print(Water.frozen.toString()); //The frozen water is 32 F.
なるほど。
print
しようとすると、オーバーライドしたtoString()
メソッドが勝手に反映されているのかな。
toString()をコメントアウトしたら
// @override
// String toString() => "The $name water is $tempInFahrenheit F.";
print(Water.frozen); //Water.frozen
うむ。当たり前ですが従来通り。
参考
enum にメソッドを生やす
enum の判定メソッドも実装可能なようですね。
今まではextension
を使って書く必要がありました。
bool get isFrozen => this == frozen;
enum をよく条件分岐の際に使うのですが、if 文の中で以下のような条件を書くのが面倒だと思っていました。(特に enum の名前が長いときは)
if(type == SampleType.typeA){
...
}
extension を使った書き方はこちらの記事にまとめてあります。
まとめ
ざっくりと試してみましたが、enum に state を持たせられるので、
- enum で条件分岐
- 条件に応じてテキスト表示
みたいな場合には、enum 側に寄せて簡潔に書けるという感じでしょうか。
意識して使っていこうと思います。
参考
Discussion