40

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

  ClassName
  {
    final OtherClass field;

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

3 回答 3

47

不可能在构造函数主体中分配最终字段。final 字段需要在构造函数主体之前、初始化器列表或声明中分配:

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

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

由于你不能this在初始化列表或声明中使用,你不能做你打算做的事情。

于 2013-11-05T19:20:37.653 回答
15

使用 null safetyfinal ,您可以以不同的方式初始化字段:

  • 申报时:

    class Foo{
      final int bar = 1;
    }
    
  • 在构造函数参数中(初始化形式)。

    class Foo {
      final int bar;
    
      // Initializing in constructor parameter.
      Foo(this.bar);
    }
    
  • 在初始化列表中。

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

    class Foo {
      final int bar;
    
      Foo(int value) : bar = value;
    }
    
  • 使用late关键字进行延迟初始化。

    class Foo {
      late final int bar; // Initialize it later, maybe in a method
    }
    
于 2020-05-13T12:20:36.400 回答
1

从 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();
}

请参阅部分和以下部分

于 2021-04-02T11:36:57.613 回答