我发现自己使用了以下练习,但每次我使用它时,我内心都会有些畏缩。基本上,它是参数的前提条件测试,以确定是否应该完成实际工作。
public static void doSomething(List<String> things)
{
if(things == null || things.size() <= 0)
return;
//...snip... do actual work
}
答案 0 :(得分:14)
最好尽早回来 这样就可以执行和评估最少量的代码。
未运行的代码不能出错。
此外,它使函数更容易阅读,因为您不必处理所有不再适用的情况。
比较以下代码
private Date someMethod(Boolean test) {
Date result;
if (null == test) {
result = null
} else {
result = test ? something : other;
}
return result;
}
VS
private Date someMethod(Boolean test) {
if (null == test) {
return null
}
return test ? something : other;
}
第二个更短,不需要其他并且不需要临时变量。
请注意,在Java中,return
语句立即退出该函数;在其他语言(例如Pascal)中,几乎等效的代码result:= something;
不会返回
由于这个事实,习惯上在Java方法中返回很多点
调用此bad practice
忽略了这样一个事实,那就是特定列车早已离开了Java站。
如果您要在功能中的多个点退出某个功能,最好尽早退出
答案 1 :(得分:4)
这是一种风格和个人偏好的问题。它没有错。
答案 2 :(得分:3)
据我所知 - 否。
为了便于调试,子程序,方法或功能中只应有一个返回/退出点。
使用这种方法,您的程序可能会变得更长,更不易读,但在调试时,您可以在出口处设置断点并始终查看返回的状态。例如,您可以记录所有局部变量的状态 - 这对于故障排除可能非常有用。
看起来有一个两个“学校” - 一个说“尽早返回”,而另一个说“应该只有一个程序中的返回/退出点“。
我是第一个的支持者,虽然在实践中有时会遵循第二个,只是为了节省时间。
另外,不要忘记例外。通常情况下,您必须提前从方法返回,这意味着您处于异常情况。在您的示例中,我认为抛出异常更合适。
答案 3 :(得分:2)
PMD似乎这么认为,并且你应该总是让你的方法运行到最后,但是,对于某些快速的健全性检查,我仍然使用过早的return
语句。
它确实会损害该方法的可读性,但在某些情况下,这可能比添加另一个if
语句或其他方法更好,以便在所有情况下运行该方法。
答案 4 :(得分:2)
它没有任何内在错误,但如果它让你畏缩,你可以抛出IllegalArgumentException
。在某些情况下,这更准确。但是,无论何时调用doSomething
:
try {
doSomething(myList);
} catch (IllegalArgumentException e) {}
答案 5 :(得分:2)
这个问题没有正确答案,这是一个品味问题。
在上面的具体示例中,可能有更好的方法来强制执行前置条件,但我将多个早期返回的一般模式视为类似于函数式编程中的守卫。
我个人对这种风格没有任何问题 - 我认为它可以使代码更清晰。尝试扭曲所有内容以获得单个退出点会增加冗长度并降低可读性。
答案 6 :(得分:1)
这是一个很好的做法。所以继续你的好工作。
答案 7 :(得分:0)
它没有任何问题。就个人而言,我会使用 else 语句来执行函数的其余部分,并让它自然返回。
答案 8 :(得分:0)
如果你想避免方法中的“返回”:也许你可以使用你自己的一个异常子类并在方法的调用中处理它?</ p>
例如:
public static void doSomething(List<String> things) throws MyExceptionIfThingsIsEmpty {
if(things == null || things.size() <= 0)
throw new MyExceptionIfThingsIsEmpty(1, "Error, the list is empty !");
//...snip... do actual work
}
编辑: 如果您不想使用“return”语句,则可以在if():
中执行相反的操作if(things != null && things.size() > 0)
// do your things
答案 9 :(得分:0)
如果函数很长(例如,20行或更多),则最好在开始时返回少量错误条件,以便代码读取器在读取函数的其余部分时可以关注逻辑。如果函数很小(例如5行或更少),那么一开始的return语句可能会让读者分心。
因此,决定应主要基于函数是否更具可读性或更低可读性。
答案 10 :(得分:-1)
Java良好实践表明,返回语句应尽可能独特,并在方法结束时编写。要控制返回的内容,请使用变量。但是,对于从void方法返回,就像您使用的示例一样,我要做的就是在仅用于此目的的中间方法中执行检查。无论如何,不要认真对待 - 像continue
这样的关键字永远不应该根据Java的良好实践使用,但它们就在你的范围内。