У меня следующий класс дартс...
class Color {
final int value;
const Color._internal(this.value);
static const Color WHITE = const Color._internal(0);
static const Color BLACK = const Color._internal(1);
int get hashCode => value;
String toString() => (this == WHITE) ? 'W' : 'B';
}
Я не реализовал оператор ==.
Что произойдет, если я использую оператор == для двух экземпляров этих объектов?
Он проверит, ссылаются ли экземпляры на один и тот же объект.
Color._internal(0) == Color._internal(0); // false
const Color._internal(0) == const Color._internal(0); // true
final foo = Color._internal(1);
foo == Color._internal(2); // false
foo == Color._internal(1); // false
foo == foo; // true
Таким образом, это будет верно только для одной и той же переменной (или при передаче этой ссылки) или для ссылок const
.
Object.==
Реализация ==
по умолчанию — Object.==
, потому что ваш класс Color
по своей сути является подклассом Object
(или Object?
, когда null
).
Если вы посмотрите на реализацию Object.==), вы увидите, что это просто:
external bool operator ==(Object other);
Вот краткий обзор того, как это работает: два объекта должны быть одним и тем же объектом.
identical
Я почти уверен, что идентичная функция ведет себя точно так же, хотя формулировка в документации немного отличается:
Проверьте, относятся ли две ссылки к одному и тому же объекту.
hashCode
Переопределение hashCode
не влияет на реализацию ==
по умолчанию, поскольку она всегда будет использовать identityHashCode.
Узнайте больше о Object.hashCode.