Enhanced enums で任意の値をメンバにセットする

menu事業部 フロントエンドエンジニアの坂井田です。

皆さんは Enhanced enums を使って実装する場面はありますか。

業務でFlutterを使って実装している際に使う場面があったので、enumとあわせて書き方をご紹介します!

🥚 enumの基本の書き方

enum SimpleEnum {
  hoge,
  fuga,
  piyo,
}

これは Enhanced enums ではなく enum の書き方です。

この場合 SimpleEnum.fuga.index で値を取得できますが、中身は 0 スタートの連番になります。

// 値を取得する書き方
print(SimpleEnum.fuga.index);  // 1

実際にコードを書いていると、IDなどの定数を入れておきたいという場面があると思います。

そのような 0 以外の他の値をセットしたい場合は、次に説明するやり方で実現することができます。

🍳 任意の値を代入する場合の書き方

パターン1:classを使う

class DeviceId {
  static const hoge = 1000;
  static const fuga = 2000;
  static const piyo = 3000;
}

classで定数を指定し、DeviceId.fuga のように呼ぶことで値を取得するやり方です。

記述はとてもシンプルですが、引数などで型指定する際に定数の汎用的な型(この例ではint型)になってしまう(型安全ではない)というデメリットがあります。

checkDeviceId(int deviceId){
  // 任意の処理
}


// 引数指定の例
checkDeviceId(DeviceId.fuga);


// 値を取得する書き方
print(DeviceId.fuga);  // 2000

DeviceId に列挙しているもののみ許容したい場面では、型を限定できないため予期しないバグを発生させてしまう原因になってしまいます。

パターン2:Enhanced enums を使う

enum DeviceIdEnum {
  hoge(1000),
  fuga(2000),
  piyo(3000);

  const DeviceIdEnum(this.value);

  final int value;
}

Enhanced enums は Dart 2.17 で実装された機能のようです。

enumの中でコンストラクタを書くことで、任意の値をメンバにセットできるようになります。

型指定をする際はパターン1のようにint型ではなくenumの型(この例では DeviceIdEnum 型)を指定できるので、記述ミスを事前に防止することができます🥳

checkDeviceId(DeviceIdEnum deviceId){
  // 任意の処理
}


// 引数指定の例
checkDeviceId(DeviceIdEnum.fuga);

// 値を取得する書き方
print(DeviceIdEnum.fuga.value);  // 2000

また、デフォルトのenumのように数値だけでなく文字列なども自由に設定することができます!

最後に

定数を列挙する際は、Enhanced enums をうまく使いこなしてバグの原因を減らしましょう!!🙌

また、弊社では様々なポジションのエンジニアを募集しています。

まずはカジュアルにお話を、という形でも結構ですので是非お気軽にご応募ください!

reazon.jp