Open1

Flutterでdata class相当のものを作りたい

Shun UematsuShun Uematsu

Immutableなクラスを作成

@immutableというアノテーションを付けると、クラスはimmutableクラスと認識され、constが付与されていないなどimmutableな振る舞いをしない場合、警告を出してくれます。
immutableなクラスを作成する場合は、@immutableをつけておいたほうが良いでしょう。
ただ実際に開発する場合は、freezedパッケージを使う場合が多そうです。

freezedパッケージ

freezedパッケージは、CLIでimmutableなコードを生成してくれます。
immutableなクラスを生成するだけなら、@immutableをつけるだけで良いですが、その他にも多くの利点があります。

  • @Assertを使うことができる
  • コンストラクタ@Defaultでデフォルト値を設定することができる
  • プロパティごとにdocコメントをつけることができる
  • プロパティに@deprecatedもつけることができる
  • toString, hashCode==を自動で実装してくれる
  • copyWithメソッドの実装
  • Unions/Sealed classes対応

copyWithメソッドの実装

copyWithはディープコピーしてくれ、一部の値を変更した新しいインスタンスを生成したい場合冗長なコードを書かなくても良くなります。

Company company;
Company newCompany = company.copyWith.director.assistant(name: 'John Smith');

Sealed classes

sealed classのようなパターンマッチングは強力ですが、Dartでは現時点ではサポートされていません。
freezedではkotlinのsealed classと同様の文法で使用することができます。
kotlinにおけるsealed classはenumの拡張版であり、別のオブジェクトを持つことができます。
この辺がわかりやすい事例かと思います。
Freezedを使うことでkotlinのsealed classと同様の振る舞いを待たせることができます。