【问题标题】:Can normal and const constructors be defined within the same class?可以在同一个类中定义普通和常量构造函数吗?
【发布时间】:2019-08-26 21:17:09
【问题描述】:

在 Dart 中,我发现可以在类中创建 const 构造函数。是否可以在使用相同字段的类中混合使用普通构造函数和 const 构造函数?或者它是否旨在始终将用于创建可变和不可变实例的类分开?

我尝试在同一个类中创建一个普通的和 const 的构造函数。问题是 const 构造函数需要 final 字段,因此如果一个普通的构造函数使用这些字段,那么它的实例字段将是不可变的。

void main() {
  Jank fj = Jank.normal(5, 'LOL');
  const cj = const Jank.fixed(6, 'HA');

  fj.a = 123;       //cannot do this, but want to
  cj.a = 456;       //cannot do this, is expected
}

class Jank {
  final int a;
  final String b;

  Jank.normal(this.a, this.b);
  const Jank.fixed(this.a, this.b);
}

我希望在使用 const 构造函数时能够使用不可变字段,并在使用普通构造函数时使用可变字段。似乎是其中之一。

【问题讨论】:

    标签: dart


    【解决方案1】:

    您可以在具有 const 构造函数的类上使用非 const 构造函数,但所有字段仍需要为 final。

    您还可以将new(隐式)与 const 构造函数一起使用(但不能反过来)。

    所以与非常量构造函数的区别在于构造函数可以有一个主体,但它不能做很多事情,因为它不能更新类的状态。它只能调用 const 实例之外的状态更改。

    一种解决方法是使用Expando

    构造函数初始值设定项列表允许更多表达式,因为它们不限于仅在 const 上下文中允许的少数表达式。

    所以在整体上混合 const 和 non-const 是相当有限的,只用于边缘情况。

    您可以做的是创建一个不同的类,该类使用 const 构造函数实现该类,并使用工厂构造函数透明地实例化它。

    class Foo {
      final int value;
    
      const Foo(this.value);
    
      factory Foo.nonConst(int val) => _Bar(val);
    }
    
    class _Bar implements Foo {
      int _value
      int get value() => _value;
    
      Bar(int val) {
        _value = val * 5;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2012-11-26
      • 2016-05-05
      • 2015-10-25
      相关资源
      最近更新 更多