11

你更喜欢哪个?为什么”

String myString = null;
if(someCondition)
   myString = "something";
else
   myString = "something else";

或者

String myString = "";
if(someCondition)
   myString = "something";
else
   myString = "something else";

我知道使用三元 (? :) 运算符是可能的,但我想知道以上两个。

4

7 回答 7

27

两者都不。相反,这个:

String myString;
if (someCondition)
   myString = "something";
else
   myString = "something else";

在您的两种选择中,变量都使用永远不会被读取的值进行初始化。它存在的事实是误导性的。

当然,我实际上会使用条件运算符 - 但除此之外,以上是更好的选择。

于 2010-07-23T17:01:31.753 回答
19

惯用的方法是使用三元/条件运算符(JLS 15.25):

String myString = (someCondition ? "something" : "something else");

if-else但如果你真的觉得必须这样做,你也可以做更详细的陈述:

final String myString;
if(someCondition) {
   myString = "something";
} else {
   myString = "something else";
}

请注意,我final在上面的代码段中添加了修饰符。如果您计划对变量进行进一步的重新分配,那么当然不能final,因此您可以删除修饰符,当然代码仍然可以工作。


为什么final

上面代码片段中的要点final是表明该if-else构造将在所有可能的执行路径中分配myString一次且恰好一次。这就是所提议的if-else解决方案的主要思想:如果你打算只为一个局部变量赋值一次,即使它可能是几种可能性之一,那么让它final提高可读性。

将其与此“替代”提案进行对比,例如:

// DON'T DO THIS! Example only!
String myString = "something else";
if (someCondition) myString = "something";

使用此构造,您可能会分配myString两次,因此final即使没有进一步的重新分配,您也无法将其放在这里。您也不能final输入原件= null;= "";提案中的任何一个,这是不推荐它们的主要原因之一。

如果您只是要在使用它之前覆盖它,那么为变量赋值是没有意义的。它会损害可读性,甚至可能隐藏错误,例如,当一个执行路径无法覆盖此“初始”值时。

参考


概括

  • 如果无论如何要覆盖它,请不要仅仅为了这样做而“初始化”局部变量
    • 让它未初始化,以便编译器可以通过指出该变量仍未初始化时的任何使用来帮助您识别可能的错误
    • 如果代码编译,那么在所有使用之前,变量至少被分配一次“真实”值
  • 如果您不需要重新分配局部变量,请使其final增强可读性
    • final立即向读者保证没有进一步的重新分配是可能的
    • 编译器可以帮助您防止犯后续重新分配的错误
    • 如果代码编译,那么在所有使用之前,该变量恰好被分配一个“真实”值
  • 一般来说,你应该让编译器帮你写出最好的、最易读的代码。
于 2010-07-23T17:01:51.617 回答
2

初始化步骤不是必需的,可能会使未来的读者感到困惑。

我个人的看法是这种变量应该只分配一次,因此它是final关键字的完美候选者。

final String myString;
if (someCondition) {
   myString = "something";
} else {
   myString = "something else";
}

请注意,myString 定义不包括赋值(因为这将禁止以后的赋值),并且在赋值之后它是只读的。这提供了健壮的代码并更清楚地显示您的意图。

另请注意,即使是单行,我也相信大括号。可能是 Perl 的一种习惯,但如果你不这样做,它总有一天会咬你。

于 2010-07-23T17:16:35.547 回答
0
String myString = "something else";
if(someCondition) myString = "something"; // (use curly braces if you prefer)
于 2010-07-23T17:01:58.450 回答
-2

我更喜欢第一个,因为String myString = ""会在池中创建额外的对象

于 2010-07-23T17:02:15.870 回答
-2
String mystring = null;
mystring.length() 
// Cause error

以上将由于空指针而导致错误。

string myString = new String();
myString.length()
// will not cause error

我喜欢以后使用,但我认为这是个人喜好。

于 2010-07-23T17:05:14.333 回答
-2

这个下面的代码怎么样,反正他想设置一些东西。

String myString = (someCondition)  ? "something " : "else something";

或这个

String myString = "else something"; 

if (someCondition)
   myString = "something";

在上述情况下,如果您 90% 确定 someCondition 始终为真。否则在声明中创建不必要的对象。期待大师的评论。

于 2010-07-24T10:06:30.857 回答