final 不代表深 final。
即使您修改了列表内容,list 变量仍然引用相同的列表实例。任何可变实例都可以修改,即使它已分配给最终变量。
想象一下
void main() {
var l = [1,2,3];
final List<int> list = l;
}
现在您将无法修改l 引用的列表中的项目,因为该列表也分配给了最后一个字段list(list 和l 都引用了同一个列表)。这没有意义。
使列表不可变的方法是
final List<int> list = const[1,2,3];
现在您不能将另一个列表分配给list,也不能修改list 引用的列表的内容。
另一种方法
import 'dart:collection'
...
var l = [1,2,3];
final List<int> list = UnmodifiablyListView(l);
现在您不能修改list 或list 引用的列表内容,但可以修改l 引用的内容(list 将反映对l 所做的更改。
如果您失去对l 的引用,您将无法修改内容。
var l = [1,2,3];
final List<int> list = UnmodifiablyListView(l);
l = null;
final 很好,例如,当您希望确保 list 字段永远不会设置为 null。
class MyModel {
final list = [];
}
list 字段是公开的,但没有人可以将list 设置为例如null。
var model = new MyModel();
...
model.list.forEach(print);
不会因为null doesn't have a method 'forEach'之类的异常而失败。
这与
类似,但更简洁
class MyModel {
var _list = [];
List get list => _list;
}