Java字符串初始化

ewa*_*ewa 11 java conditional preferences variable-initialization

你更喜欢哪个?为什么"

String myString = null;
if(someCondition)
   myString = "something";
else
   myString = "something else";
Run Code Online (Sandbox Code Playgroud)

要么

String myString = "";
if(someCondition)
   myString = "something";
else
   myString = "something else";
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 27

都不是.相反,这个:

String myString;
if (someCondition)
   myString = "something";
else
   myString = "something else";
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我也喜欢这个.为什么给myString一个只会被替换的值? (2认同)

pol*_*nts 18

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

String myString = (someCondition ? "something" : "something else");
Run Code Online (Sandbox Code Playgroud)

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

final String myString;
if(someCondition) {
   myString = "something";
} else {
   myString = "something else";
}
Run Code Online (Sandbox Code Playgroud)

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


为什么final

final上面代码片段的要点是显示if-else构造将myString在所有可能的执行路径中分配一次且恰好一次.这是所提出的if-else解决方案的主要思想:如果您要将一个值仅分配给局部变量一次,即使它可能是多种可能性之一,也可以使其final增强可读性.

与此"替代"提案形成对比,例如:

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

使用此构造,您可能会分配myString两次,因此final即使没有进一步重新分配,也无法放在此处.您也无法提交final原件= null;= "";提案,这也是他们不推荐的主要原因之一.

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

参考


摘要

  • 如果您要覆盖它,请不要仅仅为了这样做而"初始化"局部变量
    • 让它未初始化,以便编译器可以通过指出变量的任何使用来帮助您识别可能的错误,同时它仍然未初始化
    • 如果代码编译,则在所有使用之前为变量分配至少一次 "真实"值
  • 如果您不需要重新分配局部变量,请将其设置final为增强可读性
    • final 立即向读者保证不可能进一步重新分配
    • 编译器可以帮助您防止使得随后的再分配的错误
    • 如果代码编译,则变量被分配了一个"真实"的价值恰好一次全部使用前
  • 一般来说,您应该让编译器帮助您编写最好,最易读的代码.

  • 我不认为final对局部变量是否需要赋值有任何影响,并且您的链接似乎支持这一点.你能澄清一下你的意思吗? (2认同)
  • 现在很好的答案,+ 1. (2认同)