我应该有一个 List<SomeObject>
并有一个函数返回该对象的引用(如果可用)。
SomeObject GetSomeObject(List<SomeObject>, int x){
/* Search for object in list that has a properties
with value x */
if (found)
return /* The object found */
else
return NULL;
}
void DoSomething(SomeObject S){
if(S!=NULL){
/* Do action 1 */
}
else{
/* Do action 2 */
}
}
我在什么地方读到过 NULL
不是干净代码的一部分。所以我想知道这个案子的等效代码是什么。
更新:我读过这个问题,我认为我的情况是不同的。在这种情况下,如果 NULL
是回来了就什么都不做,而我需要做些什么如果 NULL
被退回
4条答案
按热度按时间lsmepo6l1#
如果您使用的是Java8,请考虑可选类,但请注意,它并不适用于任何地方。
许多人(包括我在内)认为
Optional
应该只用于返回值,而不是参数,尤其是不用于对象属性。不过,一如既往地,没有硬性规则,只是要小心不要将null处理替换为Optional
如果你从中得到任何好处,就盲目地,不理解。在示例代码中,
Optional
对你没有任何好处。因为不管是否为null,您都会执行一些操作,所以您只是在更改if(s == null)
至if(s.isPresent())
. 但是,如果逻辑仅在s为非空且没有else
你可以使用Optional.ifPresent()
把东西弄干净一点。当然还有其他有用的方法Optional
这将为您提供更清晰的代码,例如orElse()
它可以有效地用于使用默认值。iqxoj9l92#
看起来您指的是特殊的case模式(特定的实现是option或null对象模式)。
有选项类型的java实现,名为
Optional
,在Java8和guava库中。在你的情况下,你将使用
Optional<SomeObject>
还有这个实现(我使用的是guava实现):因此,返回可选对象的代码是可以自我解释的。然后您将拥有:
xxb16uws3#
你可以抛出nosuchelementexception,这与“fail fast”的美沙酮很好地吻合。
但是,如果您的代码开始对流控制使用异常机制,这是一个非常大的禁忌,您应该避免它。
一个好的经验法则是在元素不存在时抛出异常,前提是您的api还支持
contains()
(或HasSomeObject(obj)
)方法。免责声明:这个答案适用于java-8之前的代码,对于java8,更好的实践可能是可选的,正如@kayman所建议的
ewm0tg9j4#
您可以考虑的一种常见方法是空对象模式。
不是返回null,而是返回一个正确对象类型的示例,当您调用它的方法时,它什么也不做。它并不适合所有的情况,但它值得考虑。