はじめに
Dartに即時クラスが無かったのでがっかりしていたら、Record型というものを見つけたのでまとめておきます。
Record型とは
Dart2.15から導入された新しいデータ型で、イミュータブルなデータ構造を表現するための手段です。クラスと似たような機能を持っていますが、不変性やデータの等価性を保証するための仕組みが組み込まれています。
特徴 | 説明 |
イミュータブルなデータ | 定義されたオブジェクトは不変です。 |
フィールドの自動生成 | フィールドを定義するだけで自動的にイミュータブルなクラスを生成します。 |
等価性の比較 | record型のオブジェクトはフィールドの値に基づいて等価性が比較されます。同じフィールド値を持つ2つのrecord型オブジェクトは等価であると見なされます。 |
コンパイル時最適化 | コンパイル時に最適化されるため、効率的な実行性能が期待できます。ヒープメモリを使用せずにスタックメモリに割り当てられる場合があり、オブジェクトの生成と破棄が高速化されます。 |
Flutterのfreezedパッケージとの比較
Flutterには、イミュータブルなデータクラスを簡単に定義するための便利なパッケージにfreezedがあります。Record型があるので、freezedパッケージを使う意義があるのか気になるので調べておきます。
Record型の定義と作成
Record型は、recordキーワードを使用して定義されます。以下は、PersonというRecord型を定義し、インスタンスを作成する例です。
record Person(String name, int age);
void main() {
var person = Person('Alice', 30);
print(person.name); // Alice
print(person.age); // 30
}
DartRecord型の利点と使用法
Record型はデータの不変性を保証し、安全なコードを記述するのに役立ちます。
record Point(int x, int y);
void main() {
var p1 = Point(1, 2);
var p2 = Point(1, 2);
//フィールドの値が全て一致しているので、等価として判定
print(p1 == p2); // true
var p3 = Point(3, 4);
var points = {p1, p2, p3};
// p1とp2が等価な為、Setで重複を排除されている
print(points.length); // 2
}
DartRecord型とパターンマッチング
Record型はパターンマッチングと組み合わせて強力な機能を提供します。
void processPerson(Person person) {
// Personオブジェクトのパターンマッチング
switch (person) {
case Person('Alice', 30):
print('Alice is 30 years old.');
break;
case Person('Bob', 25):
print('Bob is 25 years old.');
break;
default:
print('Unknown person.');
}
}
void main() {
var person1 = Person('Alice', 30);
var person2 = Person('Bob', 25);
processPerson(person1); // Alice is 30 years old.
processPerson(person2); // Bob is 25 years old.
}
Dartまとめ
DartのRecord型は、データの不変性を保証し、安全かつ効率的なコードを記述するための便利な機能です。Record型を活用することで、簡潔で明瞭なコードを作成し、バグを減らすことができます。
Flutterなどで、Freezedパッケージを使うほどではない場面では便利そうです。