嗨,我写了一个小函数,例如
public void foo(MyClassA paraA) {
if (paraA == null) return;
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) return;
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) return;
....
}
上面的代码很快就失败了,而且读起来很舒服(即返回空值的意图很明确)。但现在我不想简单地返回,而是想做一些错误日志记录,所以我改为
public void foo(MyClassA paraA) {
if (paraA == null) {doLog(); return;}
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) {doLog(); return;}
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) {doLog(); return;}
....
}
上面的内容也很干净且易于阅读,但我必须重复 doLog() 几次。所以我再次更改为
public void foo(MyClassA paraA) {
if (paraA != null) {
MyClassB paraB = doSomeStuff(paraA);
if (paraB != null) {
MyClassC paraC = doMoreStuff(paraB);
if (paraC != null) {
....
return;
}
}
}
doLog();
}
上面只调用了一次 doLog() ,但我以一些深度嵌套的 if 语句结束,这些语句非常丑陋且难以阅读。那么我如何保持像以前一样的清洁度并且只使用一次 doLog() 呢?请注意,不允许为 foo() 返回除 void 之外的其他内容。我还读到,使用 try/catch 来反对 null 检查是一种反模式。
如果我要尝试,我想写一些类似的东西
public void foo(MyClassA paraA) {
while(true) {
if (paraA == null) break;
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) break;
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) break;
....
return;
}
doLog();
}
上面的内容满足了我的所有需求(快速失败、干净、没有嵌套 if),但是这里使用 while 循环是否是一种反模式,因为这里的 while 循环永远不会运行多次?
最佳答案
Java 有一个漂亮的带标签的中断结构,可能会对您有所帮助。
public void foo(MyClassA paraA) {
block: {
if (paraA == null) { break block; }
MyClassB paraB = doSomeStuff(paraA);
if (paraB == null) { break block; }
MyClassC paraC = doMoreStuff(paraB);
if (paraC == null) { break block; }
...
return;
}
doLog();
}
如果你更好地使用多态性,你可以这样做:
public void foo(MyInterface para) {
while (para != null) {
para = para.doStuff();
}
doLog();
}
如果您绝对不能使用这样的多态性,请使用调度程序。
但我以前见过这个,它看起来像一个状态机。搜索“java enum state machine”。我有一种感觉,这就是您真正想要做的事情。
关于java - 使用while循环避免java中if语句的深度嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28494148/