3

对于下面的代码,声纳中显示了一个提示:

重构此代码以使用“静态最终”模式。

我不明白,这是什么问题。声纳中也没有清楚地解释它。

请帮我。

public Boolean validateLabelText(String labelValue, String fieldCell) {
        return labelValue
               .replaceAll(StringUtils.SPACE, StringUtils.EMPTY)
               .equalsIgnoreCase(fieldCell.replaceAll(StringUtils.SPACE, StringUtils.EMPTY)
                                          .replaceFirst(StringUtils.LF, StringUtils.EMPTY));
    }
4

2 回答 2

5

重构此代码以使用“静态最终”模式。

您遇到了以下问题:Regex 模式不应该被不必要地创建

问题是由以下操作引起的:

.replaceAll(StringUtils.SPACE, StringUtils.EMPTY)
.replaceFirst(StringUtils.LF, StringUtils.EMPTY)

这两种方法都创建了java.util.regex.Pattern类的新实例。这意味着当您的方法执行 100 次时,您的代码会创建 300 个Pattern对象。该规则告知您不应该这样做,因为Pattern这些对象很重,您可以使用更高效的代码。

如果StringUtilsorg.apache.commons.lang3.StringUtils,则解决方案如下。

在第一次操作中

.replaceAll(StringUtils.SPACE, StringUtils.EMPTY)

您想" "用(空)替换所有出现的(空格"")。此代码应更改为:

.replace(StringUtils.SPACE, StringUtils.EMPTY)

replace方法按原样替换文字。replaceAll将第一个参数视为正则表达式。将空格字符解析为正则表达式是没有意义的,因为输出将完全相同。

下一个

.replaceFirst(StringUtils.LF, StringUtils.EMPTY)

你总是PatternStringUtils.LF. 与其每次都创建一个新模式,不如先编译一次,然后再重用它:

private static final Pattern LF_PATTERN = Pattern.compile(StringUtils.LF, Pattern.LITERAL);
LF_PATTERN.matcher(string).replaceFirst(replacement);

最终代码应如下所示:

private static final Pattern LF_PATTERN = Pattern.compile(StringUtils.LF, Pattern.LITERAL);

public Boolean validateLabelText(String labelValue, String fieldCell) {
    String value1 = labelValue.replace(StringUtils.SPACE, StringUtils.EMPTY);

    String value2 = fieldCell.replace(StringUtils.SPACE, StringUtils.EMPTY);
    value2 = LF_PATTERN.matcher(value2).replaceFirst(StringUtils.EMPTY);

    return value1.equalsIgnoreCase(value2);
}

我不知道你的代码的业务逻辑是什么,所以我将变量命名为value1and value2(我不知道哪个值是current哪个expected)。

于 2020-06-13T18:27:14.013 回答
0

rustyx 是对的。该方法可作static final。我认为,这就是声纳信息的原因。还要考虑这三点。

replaceAll有一个正则表达式作为它的第一个参数,但这里不需要正则表达式。你可以replace在这里使用。使用正则表达式会降低性能,它们比较慢。

考虑boolean用作返回类型。使用Booleanfor 进行测试的方法通常是不好的风格,因为调用者还必须检查返回值null。很少需要布尔值具有空值。当您使用 时boolean,您对调用者说返回值不能null也不必检查该值。由于装箱/拆箱,使用Boolean也可能比使用慢。boolean

顺便说一句:不要使用StringUtils.EMPTY. 这个常量通常是无用的,只会使代码膨胀。您可以阅读有关该主题的问题和答案:建议使用 StringUtils.EMPTY 吗?.

性能问题(第 1 和第 2 号)可能不是真正的问题,具体取决于应用程序以及调用该方法的频率。

于 2020-06-10T15:27:47.243 回答