【问题标题】:In Freezed generated classes, how to check if two objects are the same instance?在冻结生成的类中,如何检查两个对象是否是同一个实例?
【发布时间】:2022-08-07 13:27:20
【问题描述】:

我正在使用 Freezed 进行 dart 不可变数据建模​​。此生成器正在覆盖 == 运算符和 hasCode,这适用于 99% 的情况。

但是我有一个特殊情况,比较长列表需要时间并且列表是内部管理的。因为无法从外部访问并且我可以保证列表不会更新,所以我可以比较实例本身而不是内容。

那么问题来了,如何判断两个对象是否是同一个实例呢?

如果因为覆盖==操作符和hasCode方法而没有办法,在这种情况下是否可以禁用两者的生成,但仍然生成其他代码?

注意:有一个类似的问题here,但我想继续使用Freezed。

标签: flutter dart freezed flutter-freezed


【解决方案1】:

看看identical 函数。它检查两个引用是否指向同一个对象.

identical(freezed_a, freezed_b);

identical 返回 true 有两种特殊情况:

  1. 对于相同的常量表达式;
  2. 对于整数;

    出于性能原因,它将它们规范化为同一个对象。从文档:

    final a = new Object();
    final b = a;
    print(identical(a, Object())); // false, different objects.
    print(identical(a, b)); // true, same object
    print(identical(const Object(), const Object())); // true, const canonicalizes
    print(identical([1], [1])); // false
    print(identical(const [1], const [1])); // true
    print(identical(const [1], const [2])); // false
    print(identical(2, 1 + 1)); // true, integers canonicalizes
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 2020-03-23
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多