繁体   English   中英

Java 嵌套的 If/Else 条件

[英]Java Nested If/Else Conditionals

我有一系列 8 个“淘汰赛”if 语句,必须通过这些语句才能显示适当的响应。 如果这 8 个 if 语句中的任何一个失败,则会显示相应的响应。 下面是我的代码...

 if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){
            if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int &&
               adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int)
                if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int)
                    if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int)
                        if(bodilyInjuryCust.equals(bodilyInjuryComp1))
                            if(propDamageCust.equals(propDamageComp1))
                                if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both"))
                                    if(unUiBodilyCust.equals(unUiBodilyComp1))
                                    {
                                    btnComp1.setVisible(true);
                                    lblPriceComp1.setText("$ " + price1String);
                                    lblPriceComp1.setVisible(true);
                                    }
        } else
        {
            lblPriceComp1.setText("Not Competitive");
        }

我得到的结果大多是正确的,但时不时地,else 块中适当的“非竞争性”结果并未按应有的方式显示。 我的猜测是因为 else 语句仅适用于第一个 if 语句,并且如果它被传递,则 else 块不会被执行。 我需要构建我的 if 语句,以便如果任何 if 语句失败, else 块将执行。 我曾尝试重组我的块但没有成功。 有任何想法吗?

正如其他人所建议的,使用 If 链接概念,使用&&,将所有条件合并为一个 if 块

最简单的可能在下面。

boolean isValid = false;

     if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){
                if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int &&
                   adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int)
                    if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int)
                        if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int)
                            if(bodilyInjuryCust.equals(bodilyInjuryComp1))
                                if(propDamageCust.equals(propDamageComp1))
                                    if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both"))
                                        if(unUiBodilyCust.equals(unUiBodilyComp1))
                                        {
                                        btnComp1.setVisible(true);
                                        lblPriceComp1.setText("$ " + price1String);
                                        lblPriceComp1.setVisible(true);
                                        }
                                isValid  = true;
            }

// 稍后检查变量值如果不为真,表示它没有进入任何 if 语句。

if(!isValid){
     lblPriceComp1.setText("Not Competitive");
}

提高可读性和解决您引用的问题的一种方法是提取您在方法中提到的各个条件(从而为它们命名它们正在做什么)
并像其他人已经建议的那样使用链来调用它们。

private boolean checkAgeLimits(int ageCustInt){
 return (ageCustInt >= ageMinComp1Int) && (ageCustInt <= ageMaxComp1Int);
}
private boolean checkAdtV1MileageCustInt(int adtV1MileageCustInt){
 ...
}
 ...
other validator methods
 ...
if (checkAgeLimits(ageCustInt)
    && checkAdtV1MileageCustInt(adtV1MileageCustInt)
    && .. other validators){
                                        btnComp1.setVisible(true);
                                        lblPriceComp1.setText("$ " + price1String);
                                        lblPriceComp1.setVisible(true);

            } else
            {
                lblPriceComp1.setText("Not Competitive");
            }

从复杂性级别来看,从技术上讲,关于条件语句或异常处理程序的级别永远不应该超过 3 个级别。 如果您深入到这一点,最好的建议是将代码拆分并形成自己的方法。 通过这种方式,您可以以更具建设性的方式划分和征服您的逻辑,而不会使您的生活(或开发人员接管代码)过度复杂化。

基于您的代码库的示例如下(我没有实例化对象,因为您必须自己做):

/**
 * Add comment on the purpose of this method
 */
public void someMethod() {
    boolean isValid = false;
    if (ageCustInt >= ageMinComp1Int) {
        isValid = checkPointOne();
    }

    if(!isValid){
        lblPriceComp1.setText("Not Competitive");
    }
}

/**
 * Add comment on the purpose of this method
 * @return
 */
public boolean checkPointOne() {
    if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int) {

        if (adtV1MileageCustInt >= adtVMileageMinComp1Int
                && adtV2MileageCustInt >= adtVMileageMinComp1Int
                && adtV3MileageCustInt >= adtVMileageMinComp1Int
                && adtV1MileageCustInt <= adtVMileageMaxComp1Int
                && adtV2MileageCustInt <= adtVMileageMaxComp1Int
                && adtV3MileageCustInt <= adtVMileageMaxComp1Int) {
            return checkPointTwo();
        }
    }
    return false;
}

/**
 * Add comment on the purpose of this method
 * @return
 */
public boolean checkPointTwo() {
    if (totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) {

        if (totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) {
            return checkPointThree();
        }
    }
    return false;
}

/**
 * Add comment on the purpose of this method
 * @return
 */
public boolean checkPointThree() {
    if (bodilyInjuryCust.equals(bodilyInjuryComp1)) {
        if (propDamageCust.equals(propDamageComp1)) {
            return checkPointFour();
        }
    }
    return false;
}

/**
 * Add comment on the purpose of this method
 * @return
 */
public boolean checkPointFour() {
    if (currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) {
        if (unUiBodilyCust.equals(unUiBodilyComp1)) {
            activateForm();
            return true;
        }
    }
    return false;
}

/**
 * This method will activate the form
 */
public void activateForm() {
    btnComp1.setVisible(true);
    lblPriceComp1.setText("$ " + price1String);
    lblPriceComp1.setVisible(true);
}

希望这可以帮助您过滤掉不需要的逻辑,因为这种方法将帮助您做出更好的编码选择,而不是走上编码地狱的道路。 祝你好运! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM