avoid_implementing_value_types
不要实现覆盖 ==
的类。
详情
#不要实现覆盖 ==
的类。
==
运算符在合同上要求是等价关系;也就是说,对于所有对象 o1
和 o2
对称地,o1 == o2
和 o2 == o1
必须同时为真,或同时为假。
注意:Dart 没有真正的值类型,因此我们认为实现
==
的类是用于识别值类型的代理。
当使用 implements
时,您不会继承 ==
的方法体,这使得几乎不可能遵循 ==
的约定。覆盖 ==
的类通常可以直接在测试中使用,无需创建模拟或伪造对象。例如,对于给定的类 Size
dart
class Size {
final int inBytes;
const Size(this.inBytes);
@override
bool operator ==(Object other) => other is Size && other.inBytes == inBytes;
@override
int get hashCode => inBytes.hashCode;
}
错误示例
dart
class CustomSize implements Size {
final int inBytes;
const CustomSize(this.inBytes);
int get inKilobytes => inBytes ~/ 1000;
}
错误示例
dart
import 'package:test/test.dart';
import 'size.dart';
class FakeSize implements Size {
int inBytes = 0;
}
void main() {
test('should not throw on a size >1Kb', () {
expect(() => someFunction(FakeSize()..inBytes = 1001), returnsNormally);
});
}
正确示例
dart
class ExtendedSize extends Size {
ExtendedSize(int inBytes) : super(inBytes);
int get inKilobytes => inBytes ~/ 1000;
}
正确示例
dart
import 'package:test/test.dart';
import 'size.dart';
void main() {
test('should not throw on a size >1Kb', () {
expect(() => someFunction(Size(1001)), returnsNormally);
});
}
启用
#要启用 avoid_implementing_value_types
规则,请在您的 analysis_options.yaml
文件中的 linter > rules 下添加 avoid_implementing_value_types
analysis_options.yaml
yaml
linter:
rules:
- avoid_implementing_value_types
如果您改为使用 YAML 映射语法来配置 linter 规则,请在 linter > rules 下添加 avoid_implementing_value_types: true
analysis_options.yaml
yaml
linter:
rules:
avoid_implementing_value_types: true
除非另有说明,否则本网站上的文档反映的是 Dart 3.7.1 版本。页面上次更新于 2025-03-07。 查看源代码 或报告问题。