Некоторые классы, заполненные фреймворками (например, beans). Поэтому вы не можете гарантировать, что все поля установлены.
Посмотрите на пример: классы, помеченные как @Entity
, обычно имеют поле Integer id
. hashCode
может быть записана как:
public int hashCode() {
return id.hashCode();
}
но defencive code может выглядеть так:
public int hashCode() {
return (id != null) ? id.hashCode() : 0;
}
Нужно ли писать записи для нулевого или объемного кода с try { ... } catch (Exception e)
в hashCode
и equals
функциями?
У меня нет аргументов для defencive кодирования, так это потому, что он скрывает помещение непоследовательных объектов в коллекции и приводит к поздним ошибкам. Я ошибаюсь в этом положении?
ОБНОВЛЕНИЕ Я написал такой код:
import java.util.*;
class ExceptionInHashcode {
String name;
ExceptionInHashcode() { }
ExceptionInHashcode(String name) { this.name = name; }
public int hashCode() {
// throw new IllegalStateException("xxx");
return this.name.hashCode();
}
public static void main(String args[]) {
Hashtable list = new Hashtable();
list.put(new ExceptionInHashcode("ok"), 1);
list.put(new ExceptionInHashcode(), 2); // fail
System.out.println("list.size(): " + list.size());
}
}
и запустите его:
java -classpath . ExceptionInHashcode
Exception in thread "main" java.lang.NullPointerException
at ExceptionInHashcode.hashCode(ExceptionInHashcode.java:12)
at java.util.Hashtable.hash(Hashtable.java:262)
at java.util.Hashtable.put(Hashtable.java:547)
at ExceptionInHashcode.main(ExceptionInHashcode.java:18)
Я думаю, что я могу найти ошибку раньше, а не возвращать нуль, если объект находится в неправильном состоянии...