假设我有这样一节课

class OrderInfo {
  final String orderId;
  final String status;
  final DateTime orderDateTime;
  final DateTime? deliverDateTime;
  final String? restaurantTitle;

  OrderInfo({
    required this.orderId,
    required this.status,
    required this.orderDateTime,
    required this.deliverDateTime,
    required this.restaurantTitle,
  });
  
  // and a getter
  Something get something {
    // Very long code that I don't want to recalculate
    return something;
  };
}

因为所有字段都是final,所以没有必要重新计算(返回值将是相同的).

我试着像这样创建字段.

late Something something = () {
  // Very long code that I don't want to recalculate
  return something;
}();

但我不确定这是不是正确的做法. 有其他方法吗?或者这个可以吗?

推荐答案

后场没问题.我会将其设置为final,除非您希望允许覆盖该值.

我可能会将计算函数提取到命名帮助器函数中,如下所示:

class OrderInfo {
  late final Something something = _computeSomething();
  ...
  Something _computeSomething() {
    // Very long code that I don't want to recalculate
    return something;
  }
}

将计算放在一边使变量声明更具可读性,并且允许您根据需要重复使用_computeSomething,但在其他情况下效果是相同的.

如果Something不能是null,您还可以实现您自己的Late变量:

class OrderInfo {
  Something? _something;
  ...
  Something get something => _something ??= _computeSomething();
  ...
}

late final .. = ...相比的唯一优势是,无论_something是否已经计算过,它都允许您check.

在某些情况下,这很有用.假设计算分配了一个资源,而您希望稍后释放该资源.如果您只使用一个late变量来存储分配的值,那么您所能做的就是读取或不读取该变量.阅读它将分配资源,如果它还没有分配,然后你必须释放它. 使用可为空的变量,您可以判断是否有要发布的内容,如果没有,则什么都不做.

通常,如果您需要知道late变量是否已初始化,请考虑从一开始不要使用late,因为late对您隐藏了"已初始化"位. 隐藏细节是late final something = ...;如此漂亮和简短的原因,所以当你不需要知道的时候,使用late final是很好的.

(我通常建议不要公开late个不是final的公共字段,或者不具有初始化表达式的公共字段,因为这也会公开该字段的setter.它要么向用户公开可能未初始化的字段,冒着在读取时抛出该字段的风险,要么在API中公开用户无论如何都无法调用的setter.带有初始化器表达式的late final变量很棒,因为它没有setter,并且在读取时总是被初始化.)

Dart相关问答推荐

捕获一个区域中的所有期货

`异步内联方法`的这些定义之间有什么区别?

在 Flutter 中从树中临 timeshift 除时保留小部件状态

将Card添加到 ListView

如何从 Flutter App 连接 Ms SQL?

错误:非抽象类InternalSelectableMathState

Google Dart支持mixins吗?

Flutter-键盘显示和隐藏导致生成调用

如何在 Dart 中获取当前脚本的目录?

使用Flatter向Cloud Firestore添加对象

Flutter:出现键盘时背景图像正在挤压

找到两个数字中larger/smaller的方法是什么

我们如何在 Dart 中删除一个对象?

错误:default constructor is already defined

Dart 转换列表的每个元素

多次打印同一个字符而不循环

如何在 Dart 中尚不存在的目录 struct 中创建文件?

dart中是否有类似struct struct 的东西?

如何在 Dart 中从外部查询 shadow DOM 中的元素?

dart中的动态和对象有什么区别?