What's the best way to avoid lots of “if (obj != null)” in Java code?
Possible Duplicate:
How to avoid “!= null” statements in Java?
号
分享你的想法……
- dupe:stackoverflow.com/questions/271526/…
对于返回此类对象的方法,第一个答案是始终返回空列表、集合、数组,而不是空值。Joshua Bloch第二版有效Java第43项
- 有效的Java项目43。+ 1。
- @马克是的,我在你写评论的时候更新了我的答案;-)
- 链接不再活跃,只是通向Java技术站点
- @Manuelselva断链
- @GC修好了,谢谢。
看看空对象模式。基本的想法是你有一个特殊版本的类,你可以使用它而不是空的。
此特殊版本的字段设置为在代码中有意义的默认值。这意味着您永远不会拥有空引用,您只拥有一个在使用时不做太多工作或返回默认值的类。
- + 1。空集合几乎是这种情况的一个特例——您不需要为它们编写类。但是,传递不为空且行为安全的内容的模式是相同的。
- 虽然在某些情况下很好,但我发现它在现实世界中的使用相当有限。
- @罗宾,是的,它有一些限制,但它确实比得到nullreferenceexceptions强!!
在我看来,空支票是邪恶的。他们表明,没有合同可以确定obj是否可以是null。另一个好的选择是,编写代码的方式应确保obj永远不会被保证为null。例如:如果getter必须获得非nullobj,但不能,则必须抛出异常本身。
- 另一方面,对于许多合同,null是一个可接受的值。所以你不想消除对空的任何检查,只需要消除对所有检查的防御需求。
- @马特:是的。但是,在使用对象之前不能检查空值,而是在获取对象之后立即检查空值。
- 确切地。如果代码中到处都有空检查,则表明代码编写不当。
Yoda条件
1
| if (CONST_VALUE.equals(obj)) { ... } |
- 虽然非常有效,但也会影响可读性。
- 完全同意,可读性严重受损。但这是一个你应该熟悉的习语,有时也不必害怕使用。
- 它还隐藏了可能是错误的空指针异常
- @奥利弗沃金斯为什么?通过使用const-value对象的equals(object)方法,它将永远不会抛出NPE(假设const-value是一个已经初始化的常量)。
- 是的,它们是常数,应该是好的。但它读得不好:obj.equals(const)比const.equals(obj)读得好得多。