本エントリではequatable
の使用方法を説明する。
eqatableとは
equatable
はインスタンス同士を比較する処理を簡単に実装するパッケージ。通常インスタンス同士の比較処理は==
をoverrideして実装することが多い。ただしこの実装は煩雑な記述になることが多く、同じようなコードを何度も記述する必要があった。
そこでequatable
を使用することで記述をシンプルかつ簡潔にすることができる。equatable
は==
とhashCode
を内部的にoverrideしてくれるのでユーザーがわざわざ煩雑な記述を何度も繰り返す手間を省ける。
使い方
公式のリポジトリにて記述されている例を題材とする。
以下のPerson
クラスに比較用の==
メソッドを実装していく。
class Person { const Person(this.name); final String name; }
equatableを使用しない実装例
class Person { const Person(this.name); final String name; @override bool operator ==(Object other) => identical(this, other) || other is Person && runtimeType == other.runtimeType && name == other.name; @override int get hashCode => name.hashCode; }
このoperator ==
という記法はあまり見かけないかもしれないが、==
をoverrideする際に使用する。
なのでperson1
、person2
というPerson
インスタンスがあったとすると、以下のケースで
person1 == person2
はtrue
になる。
- 全く同じインスタンス
name
オブジェクトが同じ値
しかし上記の通り若干コードが長くなり、なおかつ他のクラスでも似たような流れを記述する必要が出てくる。
そこでequatable
を継承してPerson
クラスを作成する。
equatableを使用した実装例
まずequatable
をインストールする。
dependencies: equatable: ^2.0.5
次にPerson
クラスを以下のように記述する。
import 'package:equatable/equatable.dart'; class Person extends Equatable { const Person(this.name); final String name; @override List<Object> get props => [name]; }
ポイントは
@override List<Object> get props => [name];
の部分。これでname
プロパティの値が同じ時に==
がtrue
を返す。
このように見るとコードの記述量がかなり減っていることがわかる。
equatableの実行速度
equatableを使用しないで記述した場合と使用した場合を比較したデータが公式リポジトリに記載されている。
== でのインスタンス比較処理速度
Class | Runtime (μs) |
---|---|
equatableなし | 0.193 |
equatableあり(プロパティは未初期化) | 0.191 |
equatableあり(プロパティは初期化済み) | 0.190 |
このようにequatable
を用いた方が処理速度的に若干有利であることがわかる。