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)
在两种备选方案中,变量都使用永远不会被读取的值进行初始化.它存在的事实是误导性的.
当然,我实际上会使用条件运算符 - 但除此之外,以上是更好的选择.
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 立即向读者保证不可能进一步重新分配