【问题标题】:Check if an object is a compile-time constant检查对象是否为编译时常量
【发布时间】:2014-09-18 18:43:06
【问题描述】:

我正在尝试编写一个函数来执行以下操作:

isConstant(new Obj()) => false
isConstant(const Obj()) => true

有可能吗?

【问题讨论】:

    标签: dart


    【解决方案1】:

    没有。

    在运行时,编译时常量的值与您刚刚创建的新对象之间没有区别。差异只存在于编译时。

    您唯一能做的就是检查对象是否与已知的编译时间常数相同。 在这种情况下,(x) => identical(const Object(), x); 会检测到“const Object()”对象与运行时创建的任何“new Object()”对象不同。仅当您在编写函数时知道所有编译时常量时才有效,因此它可能没有用。即使使用镜像遍历所有顶级/静态“const”声明也不会找到所有常量(这可能会非常浪费)。

    你想解决什么问题需要这个功能?

    【讨论】:

    • 在我的情况下,用户只能使用编译时常量,因为我依赖于具有相同参数的对象是相同的事实。因此,如果传入的对象不是编译时常量,我想警告用户。
    • 如果它们是你自己的类的实例,你可以让你的构造函数只返回规范化的实例。这意味着拥有一组已创建的对象,当您尝试创建一个新对象时,工厂构造函数会查看该集合以查看是否已经存在等效对象,如果是则返回该对象,否则它将调用私有构造函数来创建新对象,并在返回之前将其插入集合中。请注意这一点,因为这意味着所有实例都将永远保持活动状态,并且永远不会被垃圾收集。
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多