【问题标题】:Replace this if-then-else statement by a single return statement将此 if-then-else 语句替换为单个 return 语句
【发布时间】:2019-12-05 17:05:36
【问题描述】:

在解决 sonarQube 问题时,我遇到以下警告,有人告诉我如何克服这个警告吗

方法:-

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Division other = (Division) obj;

        if (divisionId != other.divisionId)
        //getting warning for above if condition

            return false;
        return true;
    }

警告 :

将此 if-then-else 语句替换为单个 return 语句。

描述:-

应该简化包含在 if-then-else 中的布尔文字语句的返回。

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    好吧,你可以替换:

    if (divisionId != other.divisionId)
        return false;
    return true;
    

    等效于:

    return divisionId == other.divisionId;
    

    如果divisionId != other.divisionId,这将返回false,否则返回true

    【讨论】:

    • @h36p 如果条件是false,方法将返回false
    • 正如@Usagi 回答的那样,您不需要将实例转换为单独的语句。因为它只使用一次你可以做return divisionId == ((Division)obj).divisionId;
    【解决方案2】:

    我在使用 sonarlint 时收到了类似的警告消息“布尔表达式的返回不应包含在“if-then-else”语句中” 这是我以前的代码,

    if (val.isEmpty()) {
        switchCompat.setChecked( false );
    } else {
        switchCompat.setChecked( true );
    }
    

    现在我把它改成

    boolean checked = val.isEmpty();
    switchCompat.setChecked( checked );
    

    根据这个问题,它类似于,

    @Override
    public boolean equals(Object obj) {
        Division other = (Division) obj;
        if (this == obj)
            return true;
        else if (obj == null)
            return false;
        else if (getClass() != obj.getClass())
            return false;
        else if (divisionId != other.divisionId)
            return false;
        else
            return true;
    }
    

    同样的,也可以这样解决,

    @Override
    public boolean equals(Object obj) {
        boolean success;
        Division other = (Division) obj;
    
        if (this == obj)
            success = true;
        else if (obj == null)
            success = false;
        else if (getClass() != obj.getClass())
            success = false;
        else if (divisionId != other.divisionId)
            success = false;
        else
            success = true;
        return success;
    }
    

    【讨论】:

      【解决方案3】:

      声纳规则:squid:S1126-返回布尔表达式而不是布尔文字

      在 SonarQube 中,分析器贡献规则,这些规则在源代码上执行以生成问题。有四个types of rules

      • 代码味道(可维护性领域)
      • 错误(可靠性域)
      • 漏洞(安全域)
      • 安全热点(安全域)
      Noncompliant Code Example      |  Compliant Solution
      ---------------------------    |  ----------------------------
      boolean foo(Object param) {    |  boolean foo(Object param) {
          /*Some Condition*/         |    boolean expression = false;
          if(param == null) {        |    if(param != null) { // param == null - squid:S4165
              return true;           |        //expression = true; //(squid:S4165)
          }                          |    //} else {
                                     |        if(/**/) { // Compliant
          if(/**/){/* Noncompliant*/ |            expression = true; 
              return true;           |        } else if(/**/) {
          } else if(/**/) {          |            expression = true;      
              return true;           |        } else if(/**/) { // squid:S1871
          } else if(/**/) {          |            expression = true;      
              return true;           |        } else { // To avoid else.
          }                          |            expression = false;
          return false;              |        }
      }                              |    }
                                     |    return expression;
                                     |  }
      

      squid:S1871- 条件结构中的两个分支不应具有完全相同的实现:当块内有多个 else if() { } 相同代码以克服上述问题时,我们使用具有不同实现的额外 else {} 块。


      声纳源rules, making Code Analyzers - 优质的软件来自优质的代码

      • SonarQube Continuous Code Quality - 分析您的本地 CI 中的代码。在线使用 SonarQube as a Service
      • 使用Sonarlint,它可以在您的 IDE 中即时捕获问题。

      也可以看看:

      【讨论】:

        【解决方案4】:

        不完全确定您对返回 false 的 if 语句的意图,但似乎您可以简单地总是返回 false,除非“this == obj”。

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            else
                return false;
        }
        

        同样的事情可以用一条线完成

        @Override
        public boolean equals(Object obj) {
            return this == obj;
        }
        

        【讨论】:

          【解决方案5】:

          这必须工作:

          return this == obj
                  ? true
                  : obj == null
                      ? false 
                      : getClass() != obj.getClass()
                          ? false
                          : divisionId != ((Division)obj).divisionId
                              ? false : true
          

          【讨论】:

            【解决方案6】:

            尝试这样的事情:

            return null != obj && this == obj || getClass() == obj.getClass() &&
                   this.divisionId == ((Division) obj).divisionId;
            

            【讨论】: