Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java string=string.trim();坏习惯?_Java - Fatal编程技术网

Java string=string.trim();坏习惯?

Java string=string.trim();坏习惯?,java,Java,好的,我用声纳检查代码质量。它告诉我这个简单的方法会引起两个主要的警告 public static String formatString(String string) { if(string==null) { return null; } string = string.trim(); string = string.toUpperCase(); return string; } 我可以理解由于直接访问参数而产生的警告。正如你所看到的,

好的,我用声纳检查代码质量。它告诉我这个简单的方法会引起两个主要的警告

public static String formatString(String string) {
    if(string==null) {
        return null;
    }
    string = string.trim();
    string = string.toUpperCase();
    return string;
}
我可以理解由于直接访问参数而产生的警告。正如你所看到的,这个方法几乎没有什么作用。删除空白并将其放入大写。然而,问题是什么,因为它最终返回一个字符串。鉴于创建字符串的开销,创建值持有者字符串似乎超出了要求


所以我的问题是我在做什么,如果是的话,原因是什么?

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


这避免了修改通常使代码更易于分析的参数。然而,在这样一个琐碎的例程中,我并不认为这是一个合理的问题。

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

这避免了修改通常使代码更易于分析的参数。然而,在这样一个琐碎的例程中,我不认为这是一个合理的问题。

好吧,一些编码人员可能认为参数值不会改变。我通常不会更改参数,但在这么短的方法中,我很乐意这样做。另一方面,我可能会这样写:

public static String formatString(String text) {
    return text == null ? null : text.trim().toUpperCase();
}
我还可能会更改方法的名称,并为
toUpperCase

提供一个区域设置。好吧,一些编码人员可能会认为参数值不会更改。我通常不会更改参数,但在这么短的方法中,我很乐意这样做。另一方面,我可能会这样写:

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

我还可能会更改方法的名称,并为
toUpperCase

提供一个区域设置。我认为您没有做错任何事情:尽管整个代码可以像这样折叠成一行

return string == null ? null : string.trim().toUpperCase();
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;
}
private static String formatString(String string) {
    String output = null;

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

    return output;
}

我认识一些人,他们喜欢在多行中看到它。编译器应该找出与两次写回
字符串相关的所有必要优化,“不必要”,所以我认为你很好。

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

return string == null ? null : string.trim().toUpperCase();
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;
}
private static String formatString(String string) {
    String output = null;

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

    return output;
}

我认识一些人,他们喜欢在多行中看到它。编译器应该找出与两次写回
字符串相关的所有必要优化,“不必要地”,因此我认为您很好。

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

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

只要把
String$=String位于代码的第一行-并在方法的其余部分使用
$
而不是
string

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


编辑:

尽管有些约定支持在返回值时使用变量
$
,如@StephenC所述,但这是一种不好的做法,因为[code>$
]是为生成的源代码保留的,

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

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

只要把
String$=String位于代码的第一行-并在方法的其余部分使用
$
而不是
string

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


编辑:

尽管声明了一些约定支持在返回值时使用变量
$
,正如@StephenC所述,这是一种坏做法,因为它[代码>$
]保留给生成的源代码,

样式检查器确实在抱怨您正在修改方法参数的值。很多人认为这是一种糟糕的风格。因为人们不希望参数值被更改,所以阅读代码变得更加困难。(这是一种循环论证,但它确实反映了许多人实际读取/误读代码的方式。)

更时尚的解决方案是:

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();
}

样式检查器实际上在抱怨您正在修改方法参数的值。很多人认为这是一种糟糕的风格。因为人们不希望参数值被更改,所以阅读代码变得更加困难。(这是一种循环论证,但它确实反映了许多人实际读取/误读代码的方式。)

更时尚的解决方案是:

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();
}

假设你的例子是这样编码的

return string == null ? null : string.trim().toUpperCase();
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;
}
private static String formatString(String string) {
    String output = null;

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

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

Hi [Hello greetings ]
Hi [HELLO GREETINGS]
然而,进入给定的其他语言是一个坏习惯,因为其他语言不会以这种方式运行,您可以修改原始变量,以便输出是正确的

Hi [HELLO GREETINGS]
Hi [HELLO GREETINGS]
它的可读性也较低,我见过的大多数编码标准都说,除非您完全更改底层引用,否则不会直接修改输入参数,从签名中可以明显看出,这将发生

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

为了完整起见,我会这样写formatString

return string == null ? null : string.trim().toUpperCase();
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;
}
private static String formatString(String string) {
    String output = null;

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

    return output;
}
我承认我可以在这里使用三元测试(
操作符),并在一行上完成所有测试,但我倾向于认为这对m来说可读性较差