Dart立即或在构造函数中分配变量?

时间:2020-10-26 23:09:40

标签: flutter dart

在Dart中,立即赋值与在Java中的构造函数中赋值有区别吗?

class Example {
    int x = 3;
}

vs

class Example {
    int x;
    Example() {
        x = 3;
    }
}

我问,因为当我使用Flutter并尝试将使用setState的Function分配给变量时,前一种方法是不可能的,而后一种方法是可能的。

1 个答案:

答案 0 :(得分:4)

对于您而言,无关紧要。

通常,您可以通过以下几种方式初始化实例变量:

内联

class Example1 {
  T x = value;
}

优势:

  • 简洁明了。
  • 成员将在 all 构造函数中初始化。
  • 可用于初始化final个成员。
  • 在调用基类构造函数之前初始化成员,如果基类构造函数调用被派生类覆盖的成员函数,这可能很重要。

缺点:

  • 不能依赖于构造参数。
  • 不能依赖this,因为初始化发生在this生效之前。

初始化列表

class Example2 {
  T x;

  Example2() : x = value;
}

优势:

  • 可用于初始化final个成员。
  • 在调用基类构造函数之前初始化成员,如果基类构造函数调用被派生类覆盖的成员函数,这可能很重要。
  • 可以利用构造参数。

缺点:

  • 如果该类具有多个构造函数,则需要重复初始化,否则构造函数应重定向到公共构造函数。
  • 不能依赖this,因为初始化发生在this生效之前。

构造函数体

class Example3 {
  T x;

  Example3() {
    x = value;
  } 
}

优势:

  • 可以利用构造参数。
  • 可用于执行更复杂的初始化,例如无法通过单个表达式初始化成员的情况。
  • 可以使用this

缺点:

  • 不能用于初始化final个成员。
  • 如果该类具有多个构造函数,则将需要重复初始化或需要重构初始化代码(例如但不限于重定向到通用构造函数)。
  • 在调用基类构造函数后在 初始化成员。

我可能忘记了一些要点,但我认为这应该涵盖主要要点。

直接内联初始化首先发生,然后是初始化列表,然后是构造函数主体。另请参见Difference between assigning the values in parameter list and initialiser list,其中解释了this为什么仅对对象初始化的后续阶段有效。