Странная ошибка Findbugs с равными - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть метод равный, но Findbugs сообщает об ошибке, вы понимаете?

@Override
public boolean equals(final Object obj) {
    return obj instanceof String && this.value != null  
                              && this.value.equals(obj);      // this.value is a String
}

Ошибка:

Myclass.equals(Object) проверяет, является ли операнд строкой

Ответы [ 3 ]

7 голосов
/ 23 декабря 2010

Ваша реализация equals для вашего MyClass нарушит как минимум симметричные и рефлексивные свойства equals-contract :

симметричный:

для любых ненулевых ссылочных значений x и y, x.equals (y) должен возвращать true, если и только если y.equals (x) возвращает true.

InВаш случай:

MyClass A, например, со значением = "a": A.equals("a") будет истинным, а "a".equals(A) ложным.Это нарушает свойство симметрии.

reflexive:

для любого ненулевого ссылочного значения x, x.equals (x) должно возвращать true.

Но ваша реализация вернет false для

A.equals(A) 

, но должна вернуть true.

И т. Д.

4 голосов
/ 23 декабря 2010

Ваша реализация equals, конечно, странная.

С одной стороны, это очень похоже на нарушение требований

a.equals(a) == true

=== Обновление в ответ на комментарий ===

Это часть контракта равных: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

Этот тип поведения важен, когда вы помещаете свой Объект в Набор или Карту. Без упомянутого свойства вы получите утомленное поведение, при котором вы можете добавить экземпляр к множеству, а затем вызов содержит набор с точно таким же объектом в качестве аргумента, что приведет к значению false.

=== Еще одно обновление в ответ на ваш измененный вопрос ===

Поскольку вы проверяете, что операндом является строка, но ваш класс не является подклассом строки, экземпляр вашего класса никогда не будет равен самому себе в соответствии с вашим определением равенства. Также, как указано в другом ответе, симметрия будет нарушена.

Это также может быть полезно: http://findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

2 голосов
/ 23 декабря 2010
 @Override
 public boolean equals(final Object obj) {
    return (obj instanceof YourClass) && (this.value.equals(((YourClass)obj).value));      // this.value is a String
}

Как я понимаю Findbugs указывает на потенциальные ошибки.

...