【问题标题】:dart: what is the meaning of class constructor being marked as constdart:类构造函数被标记为const是什么意思
【发布时间】:2015-05-12 23:36:26
【问题描述】:

所以我见过这样的代码:

class Whatever {
  final String name;
  const Whatever(this.name);
}

构造函数被标记为const 会改变什么?有没有影响?

我已阅读:

将 const 用于您希望成为编译时常量的变量。如果 const 变量在类级别,将其标记为 static const。 (实例变量不能是 const。)

但对于类构造函数来说似乎没有意义。

【问题讨论】:

    标签: dart


    【解决方案1】:
    • 构造函数不能有构造函数体。
    • 所有成员都必须是最终的,并且必须在声明时或由构造函数参数或初始化列表初始化。
    • 您可以使用此类的实例,其中只允许使用常量(注释、可选参数的默认值……)
    • 您可以创建常量字段,例如static const someName = const Whatever()

    如果类没有 const 构造函数,则它不能用于初始化常量字段。我认为在构造函数中指定它是有意义的。您仍然可以在运行时使用 new Whatever() 创建实例或添加工厂构造函数。

    另见

    “旧式”(仍然有效)枚举是如何使用 const 的一个很好的例子 https://stackoverflow.com/a/15854550/217408

    【讨论】:

      【解决方案2】:

      如果你的类产生永远不会改变的对象,你可以使这些对象成为编译时常量。为此,请定义 const 构造函数并确保所有实例变量都是最终变量。

      class ImmutablePoint {
        const ImmutablePoint(this.x, this.y);
      
        final int x;
        final int y;
      
        static const ImmutablePoint origin = ImmutablePoint(0, 0);
      }
      

      代码示例

      修改Recipe 类,使其实例可以是常量,并创建一个常量构造函数,执行以下操作:

      • 具有三个参数:ingredients, caloriesmilligramsOfSodium(按此顺序)。

      • 使用this。自动将参数值分配给同名对象属性的语法。

      • 是常量,在构造函数声明中 Recipe 之前有 const 关键字。

        class Recipe {
          final List<String> ingredients;
          final int calories;
          final double milligramsOfSodium;
        
          const Recipe(this.ingredients, this.calories, this.milligramsOfSodium);
        }
        

      【讨论】:

        猜你喜欢
        • 2017-01-01
        • 2021-08-18
        • 1970-01-01
        • 2020-03-27
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        相关资源
        最近更新 更多