Findbugs, предупреждающий: Равняется методу, ничего не должен принимать о типе его аргумента

Это немного больше, чем было задано, но это было то, что мне нужно, когда я нашел эту запись. Этот код предоставит мантиссе, базу и знак 32-битного поплавка IEEE 754.

import ctypes
def binRep(num):
    binNum = bin(ctypes.c_uint.from_buffer(ctypes.c_float(num)).value)[2:]
    print("bits: " + binNum.rjust(32,"0"))
    mantissa = "1" + binNum[-23:]
    print("sig (bin): " + mantissa.rjust(24))
    mantInt = int(mantissa,2)/2**23
    print("sig (float): " + str(mantInt))
    base = int(binNum[-31:-23],2)-127
    print("base:" + str(base))
    sign = 1-2*("1"==binNum[-32:-31].rjust(1,"0"))
    print("sign:" + str(sign))
    print("recreate:" + str(sign*mantInt*(2**base)))

binRep(-0.75)

:

bits: 10111111010000000000000000000000
sig (bin): 110000000000000000000000
sig (float): 1.5
base:-1
sign:-1
recreate:-0.75
19
задан Greg Hewgill 12 December 2008 в 23:16
поделиться

4 ответа

Как правило, то, когда реализация равняется Вам, может проверить, чтобы видеть, равен ли класс аргумента (или совместим) к классу с реализацией прежде, чем бросить его. Что-то вроде этого:

if (getClass() != obj.getClass())
    return false;
MyObj myObj = (MyObj) obj;

Выполнение его этот путь предотвратит предупреждение FindBugs.

примечание стороны А для обращения к комментарию:
Некоторые люди требуют использовать instanceof вместо getClass для проверки безопасности типов. Существуют большие дебаты по этому, в которое я пытался не войти, когда я отметил, что можно проверить на равенство класса или совместимость, но я предполагаю, что не могу выйти из него. Это сводится к этому - если Вы используете instanceof, можно поддерживать равенство между экземплярами класса и экземплярами его подкласса, но Вы рискуете нарушать симметричные условия контракта equals. Обычно я рекомендовал бы не использовать instanceof, если Вы не знаете о необходимости в нем, и Вы знаете то, что Вы делаете. Для получения дополнительной информации см.:

36
ответ дан 30 November 2019 в 02:56
поделиться

Вы, вероятно, делаете что-то вроде этого:

public class Foo {
  // some code

  public void equals(Object o) {
    Foo other = (Foo) o;
    // the real equals code
  }
}

В этом примере Вы предполагаете, что что-то об аргументе равняется (): Вы предполагаете, что это имеет тип Foo. Это не должно иметь место! Можно также получить Строку (в этом случае, необходимо почти определенно возвратить false).

, Таким образом, Ваш код должен быть похожим на это:

public void equals(Object o) {
  if (!(o instanceof Foo)) {
    return false;
  }
  Foo other = (Foo) o;
  // the real equals code
}

(или использование более строгое getClass() != o.getClass() упомянутый Dave L.

Вы могли также посмотреть на него этот путь:

Integer i = new Integer(42);
String s = "fourtytwo";
boolean b = i.equals(s);

там какая-либо причина, что этот код должен бросить ClassCastException вместо того, чтобы обычно закончиться и установка b к false?

Бросок ClassCastException, поскольку ответ на .equals() не был бы разумен. Поскольку, даже если это - глупый вопрос ("Конечно, Строка никогда не равна Нечто!"), это - все еще допустимое с превосходным ответом ("нет" == false).

7
ответ дан 30 November 2019 в 02:56
поделиться

Я запускаю, мой равняется (Объектным) реализациям как это:

if ((object == null) || !(object instaceof ThisClass)) {
    return false;
}

Это также предотвратит предупреждение FindBugs, но автоматически не возвратится false, когда подкласс ThisClass будет вручен. Это можно было бы также считать равным, особенно если equals(Object) метод hasn’t переопределенный.

0
ответ дан 30 November 2019 в 02:56
поделиться

Я бы рекомендовал игнорировать указанное предупреждение findbugs. На практике, если equals вызывается с объектом неожиданного класса, это почти наверняка ошибка, и вы хотите быстро потерпеть неудачу при обнаружении ошибок.

Например, если у вас есть 'ArrayList files' и вы вызываете files.contains («MyFile.txt»), было бы неплохо, если бы вы получили исключение ClassCastException. Вместо этого Java просто возвращает false, и, вероятно, потребуется много времени, пока вы не обнаружите эту ошибку.

2
ответ дан 30 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: