Dart docs读到:
如果您从未打算更改变量,请使用final或const 而不是var或除了类型。可以设置最终变量 只有一次;
好的,这意味着第二次分配最终变量将无效,但无效 据说有关修改,即
void main() {
final List<int> list = [1,2,3];
list = [10, 9, 8]; //error!
list
..clear()
..addAll([10, 9, 8]); //works!
}
从本质上讲,我重新分配了最终变量list
。它与最终变量的整体思想是否相矛盾?
答案 0 :(得分:7)
final
并不代表deep final
。
即使修改列表内容,list
变量仍引用相同的列表实例。即使将任何可变实例分配给最终变量,也可以对其进行修改。
想象
void main() {
var l = [1,2,3];
final List<int> list = l;
}
现在,您无法修改l
引用的列表中的项目,因为该列表也已分配到最终字段list
(list
和{ {1}}引用相同的列表)。这没有用。
如何使列表不可变
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'
答案 1 :(得分:0)
如果您从不打算更改变量,请使用final或const,而不是var或者除了类型之外。最终变量只能设置一次;
变更变量示例:
// Set variable "person" to "me"
var person = me;
// Reassing "person" to "you"
person = you;
另一个例子:
// Set variable "person" to "me"
final person = me;
print(person.hairLength); // 25 mm
// Set variable "client" to "me"
var client = person;
// The visit to the barber
client.hairLength = 0;
// Check again final "person"
print(person.hairLength); // 0 mm
print(client.hairLength); // 0 mm
print(me.hairLength); // 0 mm
你理解吗?
P.S。
final
说明符不会忽略以下操作:
因为final
说明符不会使值不可变。它只允许对这些变量进行重新赋值操作(例如obj = newValue);