如何在构造函数体中初始化最终字段?

时间:2013-11-05 18:58:46

标签: dart

基本上,这就是我要做的事情:

  ClassName
  {
    final OtherClass field;

    ClassName()
    {
      field = new OtherClass(this);
    }
  }

3 个答案:

答案 0 :(得分:22)

无法在构造函数体中指定最终字段。最终字段需要在构造函数体,初始化列表或声明中分配:

ClassName
{
    final OtherClass field = new OtherClass(); // Here

    ClassName()
        : field = new OtherClass(); // or here 
    {

    }
}

由于您无法在初始化列表或声明中使用this,因此无法执行您打算执行的操作。

答案 1 :(得分:4)

有3种方法初始化类中的final字段。

  • 在构造函数参数中将其初始化。

    class Foo {
      final int bar;
    
      // Initialising in constructor parameter.
      Foo(this.bar);
    }
    
  • 使用初始化程序列表。

    class Foo {
      final int bar;
    
      // Initialiser list
      Foo() : bar = 1;
    }    
    
  • 两者的结合。

    class Foo {
      final int bar;
    
      Foo(int value) : bar = value;
    }
    

答案 2 :(得分:0)

从 Dart 2.12 开始,可以使用 late 关键字。 下面的代码打印 5:

class ClassName
  {
    final int var1 = 5;
    late final OtherClass field;

    ClassName()
    {
      field = new OtherClass(this);
    }
  }

class OtherClass {
  OtherClass(ClassName object) {
    print(object.var1);
  }
}

void main() {
  final object = ClassName();
}

请参阅 https://github.com/allenai/allennlp-models/tree/main/allennlp_models/generation/models 和以下部分