java - 使用while循环避免java中if语句的深度嵌套

标签 java loops if-statement while-loop nested-if

嗨,我写了一个小函数,例如

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/

相关文章:

java - 如何在 Android 中全局保存 "list"或至少实例以供在任何 Activity 中使用?

java - 为什么 Java MySQL 连接无法检测到触发器所做的更改?

python - 在两个列表中搜索项目

php - IF/ELSEIF 比较数据库中的变量

ajax - JSF 获取当前页面

java - ObjectOutputStream 和 PrintWriter 冲突

java - 从文本文件中读取

r - 优化 R 中向量的每个累积子集的计算

python - Python 中的简单 "if"语句

java - 父类初始化时创建子类对象