final 字段与深度不可变性
构建永不改变的对象
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 errorfinal 与 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 runtimeconst 集合字面量
在字面量前加上 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 反馈 — 无需本地设置。
此课程中的所有课时
- final 字段与深度不可变性
- sealed 类与穷举式 switch
- base、interface 与 final 修饰符
- copyWith 与值相等