【问题标题】:Dart. Late initialize final variables镖。后期初始化最终变量
【发布时间】:2023-04-02 12:17:01
【问题描述】:

有没有办法对最终变量进行后期初始化。问题是许多值是用类的入口点初始化的,它不是构造函数。因此他们现在不能是最终的。但在特定类的范围内,它们不会改变。例如。

  Controller controller;
  double width;

  void setup(final itemWidth) {
    controller =  MyController();
    width = itemWidth;
  }

有可能吗?现在我只看到解决方案作为注释。你可能认为这是为了视觉效果。但实际上它有助于避免在测试期间出现不可预测的流量。

【问题讨论】:

    标签: dart


    【解决方案1】:

    现在可以延迟初始化变量。有关详细信息,请参阅Dart's documentation。下面的文字是从 Dart 的文档复制而来的:

    后期最终变量

    你也可以把late和final结合起来:

    // Using null safety:
    class Coffee {
      late final String _temperature;
    
      void heat() { _temperature = 'hot'; }
      void chill() { _temperature = 'iced'; }
    
      String serve() => _temperature + ' coffee';
    }
    

    与普通的 final 字段不同,您不必在其声明或构造函数初始化列表中初始化该字段。您可以稍后在运行时分配给它。但是您只能对其赋值一次,并且在运行时会检查该事实。如果您尝试多次分配给它——比如在这里同时调用heat()chill()——第二个分配抛出异常。这是对最终初始化并且之后不可变的状态进行建模的好方法。

    【讨论】:

    • 很棒的收获。更多关于 late final 初始化的文档 - 与普通的最终字段不同,您不必在其声明或构造函数初始化列表中初始化该字段。您可以稍后在运行时分配给它。但是您只能分配给它一次,并且在运行时检查该事实。如果您尝试多次分配给它——比如在这里同时调用 heat() 和 chill()——第二次分配会引发异常。这是对最终初始化并且之后不可变的状态进行建模的好方法。
    • 如何检查_温度变量是否已初始化?请建议。谢谢。
    • @Kamlesh 我不认为有办法检查,你必须自己处理它知道何时/如何初始化变量
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多