内容

avoid_implementing_value_types

不要实现覆盖 == 的类。

此规则从 Dart 2.1 开始可用。

详情

#

不要实现覆盖 == 的类。

== 运算符在合同上要求为等价关系;也就是说,对于所有对象 o1o2o1 == o2o2 == 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