在Dart-lang中避免物体变异的方法有哪些?

时间:2016-12-13 13:10:25

标签: object dart immutability mutation

如果我们将以下代码段作为示例:

main() {
    List<int> array = [1, 2, 3, 4];
    List<int> newArray = change(array);

    print(array); // [99, 2, 3, 4]
    print(newArray); // [99, 2, 3, 4]
    print(newArray == array); // true
}

change(List<int> array) {
    var newArray = array;
    newArray[0] = 99;
    return newArray;
}

原始数组变异了。我期待通过将数组(对象)传递给更改函数并为其分配一个新变量,我可以避免变异。我知道built_collection library似乎是不可变集合的主要选择。有没有本地方式的核心库可以允许深度冻结或防止副作用(在另一个函数内部的操作)?

2 个答案:

答案 0 :(得分:4)

您可以将数组包装在UnmodifiableListView dart:collection中,然后传递它而不是数组本身。我认为这是最基本的诱饵方式。

答案 1 :(得分:3)

通过引用传递对象。这是设计的:对象通常是大型数据结构,并且每次将对象传递给函数时内部制作副本的效率都非常低。 (这与其他主要面向对象语言使用的方法相同。)

因此,arraynewArray是代码中相同底层List的两个名称。

如果您想明确创建新列表,只需更改

即可
var newArray = array;

为:

var newArray = new List.from(array);