Dartで同じオブジェクトであるかの確認をする

Dartでシングルトンのクラスを見ている時に、インスタンスが同じオブジェクトであるかどうかを確認してみたくなりました。
Rubyだと、obj1.equal?(obj2)でチェックができます。

'Ruby'.equal? 'Ruby'
# => false

もしくは、オブジェクトIDを取得してみてもいいですね。
(実行ごとに結果は変わります)

'Ruby'.object_id
# => 70314180894460
'Ruby'.object_id
# => 70314180920120

Dartではidenticalというメソッドで比較できます。

class Person {
  String name;
  Person(this.name);
}

void main () {
  final alice = Person('Alice');
  print(identical(alice, Person('Alice')));
  // => false
}

ただ、Dartでは==演算子の比較でオブジェクトが等しいかどうかを見ているそうです。
以前は===演算子もあったけれど、なくなったよう。

final alice = Person('Alice');
print(alice == Person('Alice'));
// => false

intクラスの==に、デフォルトの挙動と、overrideする際の注意点が記載してありました

(雰囲気訳)
全てのオブジェクトはデフォルトでthisotherが同じオブジェクトの時にtrueを返します。
==をoverrideすることで、classに異なる等値関係を指定できます。overrideしたメソッドは等値関係を示していなければなりません。

ただし、クラスによっては挙動が違うようで、String文字コードの並びが一致しているかどうかを見ているようです。

print('Amelie' == 'Amelie');
// => true

print('Am\xe9lie');     // => Amélie
print('Ame\u{301}lie'); // => Amélie
print('Am\xe9lie' == 'Ame\u{301}lie');
// => false

逆に、違うオブジェクトでも値が同じだったら同じとみなす、というpackageを作っている人もいました。
これも便利そう!

medium.com

言語によってオブジェクトの比較の仕様が違って面白いですね。
以上、Dartのオブジェクトの比較でした!