在Dart中修改类中的最终字段

时间:2014-10-07 12:19:59

标签: variables dart final

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。它与最终变量的整体思想是否相矛盾?

2 个答案:

答案 0 :(得分:7)

final并不代表deep final

即使修改列表内容,list变量仍引用相同的列表实例。即使将任何可变实例分配给最终变量,也可以对其进行修改。 想象

void main() {
  var l = [1,2,3];
  final List<int> list = l;  
}

现在,您无法修改l引用的列表中的项目,因为该列表也已分配到最终字段listlist和{ {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说明符不会忽略以下操作:

  1. 通过成员访问(例如obj.color = RED)修改对象成员
  2. 通过操作员&#34; [] =&#34;执行操作&#34;设置元素&#34; (例如,list [0] = RED)
  3. 因为final说明符不会使值不可变。它只允许对这些变量进行重新赋值操作(例如obj = newValue);