Сегодня окунемся в базу, которая часто у новичков вызывает вопросы и непонимание — чем отличаются сравнения identical() и ==.
Для простоты понимания сначала вспомним, что объекты в коде (переменные) и объекты в памяти — это разные вещи.
Например, вы создаете класс
Person.
class Person {
Person(this.name);
final String name;
@override
bool operator ==(Object other) => other is Person && other.name == name;
@override
int get hashCode => name.hashCode;
}
Теперь вы создаете его экземпляр и помещаете его в переменную
person.
final person = Person('Anna');
Здесь создаваемый экземпляр
Person('Anna') записывается объектом в память программы. А переменная person является ссылкой на объект Person('Anna'). Если же мы создадим два экземпляра Person('Anna'), то они будут занимать два отдельных места в памяти. И теперь очень просто разделить два понятия:
Оператор == используется для проверки того, представляют ли две переменные одно и то же значение. А метод identical() — для проверки, ссылаются ли переменные на один и тот же объект в памяти.
Разберем на примере:
void main() {
final person1 = Person('Anna');
final person2 = Person('Anna');
print(person1 == person2); // выведет true
print(identical(person1, person2)); // выведет false
}
Здесь наглядно видно, что значения у переменных
person1 и person2 одинаковые, но объекты, на которые они ссылаются — разные. ❕Есть одно маленькое, но важное уточнение — мы не используем константный конструктор. На что же влияет
const?При использовании const включается оптимизация памяти — канонизация (canonicalization). Если в программе встречаются два одинаковых вызова конструктора с
const, второй экземпляр создаваться не будет. В памяти будет существовать лишь один объект. Именно поэтому, если класс Person будет иметь константный конструктор
const Person(this.name), то наш пример будет работать иначе.
void main() {
final person1 = const Person('Anna');
final person2 = const Person('Anna');
print(person1 == person2); // выведет true
print(identical(person1, person2)); // тоже выведет true
}
❤️ — если было полезно