Pular para o conteúdo principal

avoid_implementing_value_types

Saiba mais sobre a regra de lint avoid_implementing_value_types.

Estável
Lançado no Dart 2.1

Não implemente classes que sobrescrevem ==.

Detalhes

#

NÃO FAÇA implementar classes que sobrescrevem ==.

O operador == é contratualmente obrigado a ser uma relação de equivalência; ou seja, para todos os objetos o1 e o2, de forma simétrica, o1 == o2 e o2 == o1 devem ser ambos verdadeiros ou ambos falsos.

NOTA: O Dart não tem value types verdadeiros, então consideramos uma classe que implementa == como um proxy para identificar value types.

Ao usar implements, você não herda o corpo do método ==, o que torna quase impossível seguir o contrato de ==. Classes que sobrescrevem == normalmente podem ser usadas diretamente em testes sem criar mocks ou fakes. Por exemplo, para uma classe 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;
}

RUIM:

dart
class CustomSize implements Size {
  final int inBytes;
  const CustomSize(this.inBytes);
​
  int get inKilobytes => inBytes ~/ 1000;
}

RUIM:

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);
  });
}

BOM:

dart
class ExtendedSize extends Size {
  ExtendedSize(int inBytes) : super(inBytes);
​
  int get inKilobytes => inBytes ~/ 1000;
}

BOM:

dart
import 'package:test/test.dart';
import 'size.dart';
​
void main() {
  test('should not throw on a size >1Kb', () {
    expect(() => someFunction(Size(1001)), returnsNormally);
  });
}

Ativar

#

Para ativar a regra avoid_implementing_value_types, adicione avoid_implementing_value_types em linter > rules no seu arquivo analysis_options.yaml:

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_implementing_value_types

Se você usa a sintaxe de mapa YAML para configurar as regras de lint, adicione avoid_implementing_value_types: true em linter > rules:

analysis_options.yaml
yaml
linter:
  rules:
    avoid_implementing_value_types: true

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.