74 lines
2.0 KiB
Plaintext
74 lines
2.0 KiB
Plaintext
== Why is this an issue?
|
|
|
|
In Dart, you must override either both or neither of the operator `==` and the `hashCode()` method.
|
|
|
|
That is required to keep the contract between the two:
|
|
|
|
* whenever the `hashCode` method is invoked on the same object more than once, it must consistently return the same integer, provided no information used in `==` comparisons on the object is modified
|
|
* if two objects are equal according to the `==` operator, then calling the `hashCode` method on each of the two objects must produce the same integer result
|
|
|
|
By overriding only one of the two methods with a non-trivial implementation, this contract is almost certainly broken.
|
|
|
|
=== Exceptions
|
|
|
|
The rule does not raise in mixins, because they are not supposed to be instantiated directly, but rather included in other classes.
|
|
|
|
The rule raises, however, on mixin classes, since they can also be used as normal classes, and instantiated directly.
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,dart,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
class A {
|
|
final int value;
|
|
A(this.value);
|
|
|
|
@override
|
|
bool operator ==(Object other) => other is A && other.value == value;
|
|
}
|
|
----
|
|
|
|
=== Compliant solution
|
|
|
|
[source,dart,diff-id=1,diff-type=compliant]
|
|
----
|
|
class A {
|
|
final int value;
|
|
A(this.value);
|
|
|
|
@override
|
|
bool operator ==(Object other) => other is A && other.value == value;
|
|
|
|
@override
|
|
int get hashCode => value.hashCode;
|
|
}
|
|
----
|
|
|
|
== Resources
|
|
|
|
* Dart Docs - https://dart.dev/tools/linter-rules/hash_and_equals[Dart Linter rule - hash_and_equals]
|
|
* Dart Docs - https://dart.dev/language/mixins[Language - Classes & objects - Mixins]
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
* Missing a corresponding override of 'hashCode'.
|
|
* Missing a corresponding override of '=='.
|
|
|
|
=== Highlighting
|
|
|
|
The identifier of the overridden method: either `==` or `hashCode`.
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
include::../comments-and-links.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|