基本上,这就是我要做的事情:
ClassName
{
final OtherClass field;
ClassName()
{
field = new OtherClass(this);
}
}
答案 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 和以下部分