Dart Academy · 课时

final 字段与深度不可变性

构建永不改变的对象

第 1 / 4 课13 个步骤

final 字段与深度不可变性 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。

以不可变为设计原则

不可变对象构建完成后永远不会改变。这让数据在整个应用中都可预测,也能安全共享。🔒

认识 final

final 字段会在构造期间设置一次,之后永远不能重新赋值。在对象的整个生命周期内,它都会锁定这个值。

class Point {
  final int x;
  Point(this.x);
}

重新赋值会报错

尝试为 final 字段赋予新值时,编译器会阻止您。程序运行之前,这个错误就会被发现。

final p = Point(3);
p.x = 9; // compile error

final 与 const

值在编译时已知时使用 const,值需要在运行时计算时使用 final。两者都禁止之后重新赋值。

const pi = 3.14;
final now = DateTime.now();

const 构造函数

为类提供 const 构造函数后,Dart 就能构建真正固定的实例。它的所有字段本身都必须是 final。

class Color {
  final int rgb;
  const Color(this.rgb);
}

共享的 const 实例

两个完全相同的 const 对象在内存中其实是同一个实例。Dart 会复用它们,从而节省空间和时间。

const a = Color(0);
const b = Color(0);
print(identical(a, b)); // true

浅层与深层

final 字段会阻止重新赋值,但不会冻结它所指向的内容。final List 仍然可以添加项目。

final nums = [1, 2];
nums.add(3); // allowed!

深度不可变的目标

深度不可变意味着从对象可以访问到的任何内容也都不能改变。要完全做到这一点,仅使用 final 还不够。

冻结集合

将列表包装在 List.unmodifiable 中,这样任何添加或删除操作都会抛出错误。现在整个结构都会保持冻结状态。

final tags = List.unmodifiable([1, 2]);
tags.add(3); // throws at runtime

const 集合字面量

在字面量前加上 const,即可得到一个深度不可变的编译时集合。它完全不能被修改。

const days = ['Mon', 'Tue'];
// days.add(...) is forbidden

为什么重要

不可变数据是线程安全的,易于缓存,也适合 Flutter 中的状态管理。由隐蔽变更引起的错误会直接消失。

快速检查

最后检查一下 final 和不可变性。

回顾

您已经学会:final 会锁定字段,const 会锁定编译时的值,而深度不可变需要使用 unmodifiable 或 const 集合。🎉

免费开始

用 AI 导师学习 Dart — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「final 字段与深度不可变性」课时是免费的吗?

是的 — 「final 字段与深度不可变性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。

「final 字段与深度不可变性」这节课中我会学到什么?

构建永不改变的对象 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Dart Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「final 字段与深度不可变性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Dart Academy 课中编写并运行代码吗?

能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. final 字段与深度不可变性
  2. sealed 类与穷举式 switch
  3. base、interface 与 final 修饰符
  4. copyWith 与值相等
← 返回 Dart Academy