【问题标题】:Reduce the number of conditional operators (4) used in the expression (maximum allowed 3) in SONAR减少 SONAR 中表达式中使用的条件运算符 (4) 的数量(最多允许 3 个)
【发布时间】:2020-06-25 22:07:16
【问题描述】:

从下面的代码声纳显示主要问题,如 减少表达式中使用的条件运算符 (4) 的数量(最多允许 3 个),但所有条件都必须保留在此块中 p>

声纳会从下面的代码中得到什么变化

代码

    if (cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).equalsIgnoreCase("INVALID_REQUEST")
                                || cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).equalsIgnoreCase("ERR_EMPTY")
                                || cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).equalsIgnoreCase("ERR_INVALID_DATA")
                                || cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).equalsIgnoreCase("ERR_SIM_DATE_MISSING")
                                || cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).equalsIgnoreCase("ERR_SIM_NOT_YET_ELIGIBLE")) {
    errorMessage = ErrorMessages.EPO_VALIDATEOTP_ERR_04;
    detailsMessage = ErrorConstants.INVALID_REQUEST;
 }

【问题讨论】:

    标签: java sonarlint


    【解决方案1】:

    检查字符串,大写,针对某个集合,例如

    Arrays.asList("INVALID_REQUEST", "ERR_EMPTY")
        .contains(cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG).toUpperCase())
        
    

    (集合可以存储在一个静态的final变量中,而不是每次都构建)

    【讨论】:

      【解决方案2】:

      您可以将所有错误代码封装到专用的enum 中。这也有助于减少 magic strings(类似于 magic numbers)的使用,因为枚举可以安全地用于其他地方,而不是复制字符串。

      private enum ErrorStatus {
      
          INVALID_REQUEST,
          ERR_EMPTY,
          ERR_INVALID_DATA,
          ERR_SIM_DATE_MISSING,
          ERR_SIM_NOT_YET_ELIGIBLE;
      
          //-----------------------------------------------------------------------
      
          private static final Map<String, ErrorStatus> ERROR_CODES;
      
          static {
              Map<String, ErrorStatus> codes = new HashMap<>();
              for (ErrorStatus value : values()) {
                  codes.put(value.toString(), value);
              }
              ERROR_CODES = Collections.unmodifiableMap(codes);
          }
      
          public static ErrorStatus from(String value) {
              return ERROR_CODES.get(value.toUpperCase());
          }
      
          public static boolean matches(String value) {
              return from(value) != null;
          }
      
      }
      

      然后您的原始调用可以简化为:

      // no need to call #getString multiple times like in your example
      String status = cartResJsonObj.getString(AccessIdConstants.APP_STATUS_MSG);
      
      if (ErrorStatus.matches(status)) {
          errorMessage = ErrorMessages.EPO_VALIDATEOTP_ERR_04;
          detailsMessage = ErrorConstants.INVALID_REQUEST;
      }
      

      【讨论】:

      • 还有一个优点:您可以在此枚举中包含其他状态并引入一个布尔标志来指示状态是否为错误。
      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多