Dart 封装的列表(仅供观察值)
Dart encapsulated list (just for observing values)
我有以下列表
List<ProductVariation> _productVariations = []; avoid null pointer exceptions
List<ProductVariation> get productVariations => _productVariations;
添加List<ProductVariation> get productVariations => _productVariations;
的主要目的是为了避免_productVariations
被修改,但是,我可以在列表中添加、删除或进行任何操作,如何防止productVariations
从另一个文件访问时要修改?
您可以像这样制作 getter return 列表的副本。
List<ProductVariation> get productVariations => [..._productVariations];
或者
List<ProductVariation> get productVariations => _productVariations.toList();
另一种解决方案是使用 dart:collection
中的 UnmodifiableListView
,这样效率会高很多,因为您不是在制作列表的新副本,而是只是为您的列表提供受保护的视图List
:
import 'dart:collection';
class A {
final List<int> _data = [1, 2, 3];
UnmodifiableListView<int> get data => UnmodifiableListView(_data);
}
void main() {
final a = A();
print(a.data); // [1, 2, 3]
a.data.add(5); // Unhandled exception: Unsupported operation: Cannot add to an unmodifiable list
}
这个解决方案的一个缺点是 UnmodifiableListView
是一个正常的 List
从分析器的角度来看,所以你不会从这样做得到任何静态错误。但是如果您尝试修改列表本身,您将在运行时遇到异常。为了让开发人员更清楚,我认为指定返回的类型是 UnmodifiableListView
是很好的,即使您可以只写 List
。
另一点是,如果对象不是不可变的,此解决方案(或 Jigar Patel 建议的解决方案)不会阻止您修改列表中的对象本身。因此,如果您还想防止这些更改,则需要对对象进行深度复制。
我有以下列表
List<ProductVariation> _productVariations = []; avoid null pointer exceptions
List<ProductVariation> get productVariations => _productVariations;
添加List<ProductVariation> get productVariations => _productVariations;
的主要目的是为了避免_productVariations
被修改,但是,我可以在列表中添加、删除或进行任何操作,如何防止productVariations
从另一个文件访问时要修改?
您可以像这样制作 getter return 列表的副本。
List<ProductVariation> get productVariations => [..._productVariations];
或者
List<ProductVariation> get productVariations => _productVariations.toList();
另一种解决方案是使用 dart:collection
中的 UnmodifiableListView
,这样效率会高很多,因为您不是在制作列表的新副本,而是只是为您的列表提供受保护的视图List
:
import 'dart:collection';
class A {
final List<int> _data = [1, 2, 3];
UnmodifiableListView<int> get data => UnmodifiableListView(_data);
}
void main() {
final a = A();
print(a.data); // [1, 2, 3]
a.data.add(5); // Unhandled exception: Unsupported operation: Cannot add to an unmodifiable list
}
这个解决方案的一个缺点是 UnmodifiableListView
是一个正常的 List
从分析器的角度来看,所以你不会从这样做得到任何静态错误。但是如果您尝试修改列表本身,您将在运行时遇到异常。为了让开发人员更清楚,我认为指定返回的类型是 UnmodifiableListView
是很好的,即使您可以只写 List
。
另一点是,如果对象不是不可变的,此解决方案(或 Jigar Patel 建议的解决方案)不会阻止您修改列表中的对象本身。因此,如果您还想防止这些更改,则需要对对象进行深度复制。