string = string.trim();不好的做法?

时间:2012-04-03 12:28:38

标签: java

好的我正在使用Sonar来检查代码质量。它告诉我这个简单的方法导致两个主要警告。

public static String formatString(String string) {
    if(string==null) {
        return null;
    }
    string = string.trim();
    string = string.toUpperCase();
    return string;
}

由于直接访问参数,我可以理解警告。正如你所看到的,这种方法几乎没有什么作用。删除空格并将其放入大写字母中。但是问题是什么,因为它最终会返回一个字符串。鉴于创建字符串的开销,创建值持有者字符串似乎超出了要求。

所以我的问题是我在做什么编码不好,为什么呢?

6 个答案:

答案 0 :(得分:5)

我不认为你做错了什么:尽管整个代码可以像这样折叠成一行

return string == null ? null : string.trim().toUpperCase();

我知道喜欢在多行上看到它的人。编译器应该找出所有必要的优化相关的两个“不必要地”回写string,所以我认为你很好。

答案 1 :(得分:4)

好吧,某些编码器可能会认为参数值不会改变。我通常不会改变参数,但在一个方法这个简短的我会满足于这样做。另一方面,我可能会把它写成:

public static String formatString(String text) {
    return text == null ? null : text.trim().toUpperCase();
}

我也可能更改方法的名称,并为toUpperCase提供区域设置。

答案 2 :(得分:2)

我个人认为你的代码没有什么问题。我会这样写(在空检查之后):

return string.trim().toUpperCase();

这可以避免修改通常使代码更容易分析的参数。然而,在一个像这样微不足道的例行程序中,我并不认为这是一个有效的问题。

答案 3 :(得分:2)

鉴于您的示例如果按此编码

,则有效
public static void main(String[] args) {
    String greeting = "Hello greetings ";
    String greeting2 = formatString(greeting);

    System.out.println("Hi ["+greeting +"]");
    System.out.println("Hi ["+greeting2 +"]");
}

private static String formatString(String string) {
    if(string==null) {
        return null;
    }
    string = string.trim();
    string = string.toUpperCase();
    return string;
}

抱怨您正在直接修改参数,在java中这不是一个真正的问题,因为结果代码以输出结束

Hi [Hello greetings ]
Hi [HELLO GREETINGS]

然而,进入给定其他语言的坏习惯不会这样做,你可以修改原始变量,以便输出

Hi [HELLO GREETINGS]
Hi [HELLO GREETINGS]

它的可读性也较低,我见过的大多数编码标准都说不会直接修改输入参数,除非您完全更改基础引用,并且从签名中可以明显看出这种情况会发生。

我倾向于避免瘟疫这种类型的代码(出于习惯)所以我会说它是不好的做法,但它在技术上并不正确。

为了完整性我会像这样写 formatString

private static String formatString(String string) {
    String output = null;

    if (string != null) {
        output = string.trim().toUpperCase();
    }

    return output;
}

我接受我可以在这里使用三元测试(?运算符)并在一行上完成所有操作但是我倾向于认为对于更多的初级人员而言可读性较低所以我再次避免这种情况我认为这是更具可读性,但这当然......我的意见。

答案 4 :(得分:1)

警告是因为您更改了输入变量。在某些约定[例如斯巴达编程]中,改变输入值被认为是一种不好的做法。

一些约定,例如使用变量$,如果它还包含返回值:

只需将String $ = string;放在代码的第一行 - 并在方法的其余部分使用$代替string

真正的“简单方法”是使用三元运算符(cond ? val1 : val2)来检查null,并一起返回string.trim().toUpperCase()


修改
虽然声明某些约定支持在返回值时使用变量$,但正如@StephenC所述,这是一种不好的做法,因为[$]是为生成的源保留的代码,

答案 5 :(得分:0)

样式检查器真的在抱怨你正在修改方法参数的值。很多人会留下来这是不好的风格。这使得阅读代码变得更加困难,因为人们不希望改变参数值。 (这是一种循环论证,但它确实反映了很多人实际上读取/误读代码的方式。)

更时尚的解决方案是:

public static String formatString(String string) {
    if (string == null) {
        return null;
    }
    String tmp = string.trim();
    tmp = tmp.toUpperCase();
    return tmp;
}

或......

public static String formatString(String string) {
    return (string == null) ? null :
           string.trim().toUpperCase();
}