【问题标题】:SonarLint "Replace this if-then-else statement by a single return statement"SonarLint “用一条 return 语句替换这个 if-then-else 语句”
【发布时间】:2019-11-17 09:36:02
【问题描述】:

我无法修复此代码异味:

public static boolean esStringVacio(final Object valor) {
        if (valor == null) {
            return true;
        }
        String valorTrim = valor.toString().trim();
        if ((valorTrim).equals("")) {
            return true;
        }
        if ((valorTrim).equals("null")) {
            return true;
        }
        return false;
    }

这样尝试过,但代码气味仍然存在:

if (valor == null || valor.toString().trim().equals("") || valor.toString().trim().equals("null")) {
        return true;
    } else {
        return false;
    }

【问题讨论】:

  • 你不需要返回true或false,只返回checked语句的结果:)
  • 只要有if (condition) { return true; } else { return false; },就应该改用return condition;
  • 检查“null”。真的吗?这难道不是真实数据吗?
  • @TomHawtin-tackline 它不会发生吗?也许在一个 json 或什么的?
  • @BugsOverflow 我不想使用任何无法区分文字 null(JSON 规范直接支持)和字符串“null”的 JSON 库或 API。跨度>

标签: java sonarlint


【解决方案1】:

您可以将其缩短为:

return (valor == null || valor.toString().trim().equals("") || valor.toString().trim().equals("null"));

编辑: 您可以进一步缩短为:

return ((String.valueOf(valor).trim().equals("null")) || (StringUtils.isBlank(valor)) ;

感谢欧内斯特提出这个建议。

【讨论】:

  • 多余的括号是怎么回事?还有String.isBlank.
  • toString() 可能是一项昂贵的操作。运行两次可能会不必要地消耗性能。因此,answer by EpicPandaForce 更好。
  • 你不应该真的打代码,参考youtu.be/MTCYhbfSAuA?t=194
【解决方案2】:

您可以将最后 3 个返回值组合成一个 OR,它仍然是可靠/可读的。

public static boolean esStringVacio(final Object valor) {
    if (valor == null) {
        return true;
    }
    String valorTrim = valor.toString().trim();
    return valorTrim.equals("") || valorTrim.equals("null");
}

【讨论】:

  • 走得更短:return Arrays.asList("", "null").contains(Objects.toString(valor).trim());.
  • @AndyTurner 不确定这是否是一种改进,因为破译代码的意图需要更多时间。问题本身是关于“解决自动检测到的代码异味”,我怀疑其意图是打代码。