当前位置: 首页 > article >正文

Dart 中 initializer lists

在 Dart 中,initializer lists 是构造函数的一种特性,允许你在进入构造函数体之前对某些字段进行初始化或进行检查。这些字段包括 final 字段,因为 final 字段必须在构造函数体运行之前被初始化。

以下是它的几个关键点和适用场景:


1. 什么是 Initializer List?

Initializer list 是写在构造函数签名后但在构造函数体之前的代码部分,用冒号 : 引导,多个表达式用逗号 , 分隔。

语法结构:
ClassName.constructorName(parameters)
    : field1 = value1,
      field2 = value2 {
  // 构造函数体
}

在这里,field1 = value1field2 = value2 就是初始化列表的一部分,它们在构造函数体运行之前被执行。


2. 为什么需要 Initializer List?

  1. 初始化 final 字段
    • final 字段在 Dart 中只能赋值一次,因此必须在构造函数体执行前完成初始化。
    • Initializer list 是给这些字段赋值的唯一地方。
  2. 提前运行一些逻辑
    • 你可能希望在进入构造函数体之前,完成某些逻辑,比如参数验证或初始化值。
  3. 父类构造函数调用(超类字段初始化)
    • 如果当前类继承了某个父类,super 调用也必须写在初始化列表中。

3. 代码示例

例子 1:初始化 final 字段
class Point {
  final double x;
  final double y;

  // 使用初始化列表
  Point(this.x, this.y);
}

例子 2:使用初始化列表进行字段初始化
class Point {
  final double x;
  final double y;

  // 从 JSON 数据中提取 x 和 y 的值
  Point.fromJson(Map<String, double> json)
      : x = json['x']!,
        y = json['y']! {
    print('Created a Point: ($x, $y)');
  }
}

  • 过程说明
    • 在进入 {} 中的构造函数体之前,x 和 y 就被赋值为 json[‘x’] 和 json[‘y’]。
    • 如果没有使用 initializer list,像这样的 final 字段会因为未初始化而导致编译错误。
例子 3:添加断言

断言是调试中用来检查条件的方式,只在开发环境中运行(生产环境中会被移除)。

class NonNegativePoint {
  final double x;
  final double y;

  NonNegativePoint(this.x, this.y)
      : assert(x >= 0),
        assert(y >= 0) {
    print('Created NonNegativePoint: ($x, $y)');
  }
}
  • 过程说明
    • 如果 x 或 y 是负数,断言会抛出一个错误。
    • 断言代码写在 initializer list 中,保证在构造函数执行之前验证。
例子 4:调用父类构造函数
class A {
  A(String name) {
    print('A\'s constructor: $name');
  }
}

class B extends A {
  final int age;

  B(String name, this.age)
      : super(name) { // 调用父类的构造函数
    print('B\'s constructor: $name, $age');
  }
}

  • 过程说明
    • B 的构造函数在执行之前调用了 A 的构造函数 super(name),确保父类的初始化。

4. 注意事项

  1. 字段顺序
    • Initializer list 中的字段初始化顺序与它们在类定义中的声明顺序一致,而不是写在 initializer list 中的顺序。
  2. 避免调用 this
    • 在初始化列表中,不能使用 this,因为对象还未完全初始化。

总结

Initializer list 主要用来在构造函数体执行之前完成:

  1. 初始化 final 字段
  2. 运行前置逻辑(如断言检查)
  3. 调用父类构造函数

它是一种简洁而安全的方式来确保对象在构造时的正确性。


http://www.kler.cn/a/412699.html

相关文章:

  • Python学习第十三天--面向对象,类和对象
  • 爬虫与反爬-Ja3指纹风控(Just a moment...)处理方案及参数说明
  • C#基础56-60
  • [C++]:IO流
  • Python学习34天
  • STM32C011开发(3)----Flash操作
  • 【MySQL】自动刷新flush privileges命令
  • 【技术文档:技术传播的灯塔】
  • Python学习——猜拳小游戏
  • 组会 | 大语言模型 + LoRA
  • chrome允许http网站打开摄像头和麦克风
  • C++优质学习资源汇总
  • 【开源项目】ChinaAddressCrawler 中国行政区划数据(1980-2023年)采集及转换(Java版),含SQL格式及JSON格式
  • python+django自动化部署日志采用‌WebSocket前端实时展示
  • 第76期 | GPTSecurity周报
  • 23种设计模式-生成器(Builder)设计模式
  • 解决首次加载数据空指针异常
  • scp比rz sz传文件更好
  • 海康VsionMaster学习笔记(学习工具+思路)
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6
  • C#面向对象,封装、继承、多态、委托与事件实例
  • Linux环境实现c语言编程
  • Linux介绍与安装指南:从入门到精通
  • 【Kubernetes 指南】基础入门——Kubernetes 简介(一)
  • 鸿蒙手势密码
  • Java入门:17.正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点--001