惯用的方法是使用三元/条件运算符(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
立即向读者保证没有进一步的重新分配是可能的
- 编译器可以帮助您防止犯后续重新分配的错误
- 如果代码编译,那么在所有使用之前,该变量恰好被分配一个“真实”值
- 一般来说,你应该让编译器帮你写出最好的、最易读的代码。