Канал Friflex о разработке на Flutter. Обновления, плагины, полезные материалы — превращаем знания в реальный опыт, доступный каждому разработчику.
🔗 Наш канал для разработчиков: @friflex_dev
🔗 Канал о продуктовой разработке: @friflex_product
Post #349
864
👋Привет! Это Анна, Flutter Team Lead Friflex
Сегодня окунемся в базу, которая часто у новичков вызывает вопросы и непонимание — чем отличаются сравнения identical() и ==.
Для простоты понимания сначала вспомним, что объекты в коде (переменные) и объекты в памяти — это разные вещи.
Например, вы создаете класс
Теперь вы создаете его экземпляр и помещаете его в переменную
Здесь создаваемый экземпляр
И теперь очень просто разделить два понятия:
Оператор == используется для проверки того, представляют ли две переменные одно и то же значение. А метод identical() — для проверки, ссылаются ли переменные на один и тот же объект в памяти.
Разберем на примере:
Здесь наглядно видно, что значения у переменных
❕Есть одно маленькое, но важное уточнение — мы не используем константный конструктор. На что же влияет
При использовании const включается оптимизация памяти — канонизация (canonicalization). Если в программе встречаются два одинаковых вызова конструктора с
Именно поэтому, если класс Person будет иметь константный конструктор
❤️ — если было полезно
Сегодня окунемся в базу, которая часто у новичков вызывает вопросы и непонимание — чем отличаются сравнения 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
}
❤️ — если было полезно
- ❤ 21
- 👍 4
- 🔥 4
- 🤡 2
- 😍 2



