フレームワーク(Beanなど)で満たされた一部のクラス。したがって、すべてのフィールドが設定されていることを保証することはできません。
@Entity
例を見てください:通常としてマークされたクラスにはInteger id
フィールドがあります。hashCode
次のように書くことができます:
public int hashCode() {
return id.hashCode();
}
ただし、防御コードは次のようになります。
public int hashCode() {
return (id != null) ? id.hashCode() : 0;
}
try { ... } catch (Exception e)
inhashCode
およびequals
関数を使用してnullまたはサラウンドコードの書き込みチェックを行う必要がありますか?
一貫性のないオブジェクトをコレクションに配置することを隠し、遅延エラーにつながるため、防御コーディングがそのような場合であるという議論はありません。私はこの立場で間違っていますか?
UPDATE私はそのようなコードを書きました:
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)
オブジェクトが間違った状態にある場合、ゼロを返す代わりに、エラーを早期に見つけることができると思います...