在 Dart 中,立即赋值与在 Java 中的构造函数中赋值有区别吗?
class Example {
int x = 3;
}
对
class Example {
int x;
Example() {
x = 3;
}
}
我问这个问题是因为当我使用 Flutter 并尝试将使用 setState 的 Function 分配给变量时,前一种方法不可能,但后一种方法可以。
在你的小事上,这并不重要。
一般来说,可以通过以下几种方式初始化实例变量:
class Example1 {
T x = value;
}
优点:
final
或不可为 null 的成员。缺点:
this
,因为初始化发生在this
变得有效之前(即不能依赖于其他实例成员)。 (一个例外是,如果通过声明来延迟初始化成员late
。这需要启用空安全功能。)class Example2 {
T x;
Example2() : x = value;
}
优点:
final
或不可为 null 的成员。缺点:
this
,因为初始化发生在 this
变得有效之前(即,不能依赖于其他实例成员)。class Example3 {
T x;
Example3() {
x = value;
}
}
优点:
this
(即可以使用其他实例成员)。缺点:
late
final
或不可为 null 的成员。首先发生直接内联初始化,然后是初始化列表,然后是构造函数体。另请参阅
在参数列表和初始化器列表中分配值之间的差异,这解释了为什么 this
仅对对象初始化的后期阶段有效。举个例子,成员初始化的位置很重要:
class Base {
Base() {
doSomething();
}
void doSomething() {}
}
class DerivedEarly extends Base {
int? x;
DerivedEarly() : x = 42;
@override
void doSomething() => print(x);
}
class DerivedLate extends Base {
int? x;
DerivedLate() {
x = 42;
}
@override
void doSomething() => print(x);
}
void main() {
DerivedEarly(); // Prints: 42
DerivedLate(); // Prints: null
}