在Java中允许和接受hashCode和equals方法中的异常?
|
一些类框架(如bean)填充的类.所以你不能保证所有的字段设置. 看看例子:标记为@Entity的类通常有Integer id字段. hashCode可以写成: public int hashCode() {
return id.hashCode();
}
但defencive代码可能看起来像: public int hashCode() {
return (id != null) ? id.hashCode() : 0;
}
在hashCode和equals函数中尝试使用{…} catch(Exception e),需要对空或环绕码进行写入检查吗? 我没有任何辩护编码的理由是这样的情况,因为它隐藏将不一致的对象放在集合中并导致更迟的错误.我在这个位置错了吗? 更新我写了这样的代码: 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)
我认为我可以早期找到错误,而不是返回零,如果对象处于错误的状态… 解决方法一般来说,答案是“依赖”.>如果你不应该看到该字段的null类的实例,那么允许抛出一个NPE是合理的. NPE表示错误;即您的非正式不变量被破坏的情况. 在这种特殊情况下,如果对象尚未被持久化,那么您明显地处理了id字段可以为null的对象.这是一个棘手的问题: >如果你不允许空值为id,那么你必须小心,不要把非持久性对象放入散列表. 考虑到所有这一切,我建议要么抛出NPE,要么不使用id / hashcode中的id字段. (编辑:哈尔滨站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
