我正在阅读J. Bloch的有效Java,现在我在关于局部变量初始化的部分中。以下是他所说的:
几乎每个局部变量声明都应该包含一个初始化器。如果你还没有足够的信息来初始化 一个明智的变量,你应该推迟宣言,直到你这样做。 此规则的一个 例外涉及try-catch语句。
那么,if-else
声明怎么样?我们需要在满足某些条件时初始化变量,如果不满足,则以另一种方式初始化它,如
MyClass mc = null;
if(cond)
mc = new MyClass();
else
mc = new MyClass(1);
//use mc
因为J. Bloch没有提及它,它被认为是一种糟糕的编程技术,应该避免吗?
答案 0 :(得分:4)
在我看来,最干净的方式应该是:
final MyClass mc;
if (cond) {
mc = new MyClass();
} else {
mc = new MyClass(1);
}
//use mc
因为final关键字会确保变量总是只被初始化一次(有关详细说明,请参阅本书第15项:最小化可变性,第73页)。
这是你在通常的try-catch语句中无法做到的。
always use curly braces也更有效,更安全。
答案 1 :(得分:2)
无论什么事情都可以使用,你必须初始化一个变量。
如果编译器分析在使用之前检测到变量已初始化,则可以定义变量而不进行初始化。
例如
int a;
if (...) { a = 0; }
else { a = 1;}
没关系。然而
int a;
if (...) { a = 0; }
会导致编译器错误,因为在这种情况下,条件可能不会成为真正的' a'仍然没有初始化。
我个人更喜欢'?'代码中显示的案例的运算符:
MyClass mc = cond ? new MyClass() : new MyClass(1);
如果您需要参考' mc'在初始化范围之外(if / else块)你必须这样做。它不知道这被认为是不好的做法。但是在具体情况下,可能有更好的解决方案,但如果不了解整个代码,就很难说。
答案 2 :(得分:1)
MyClass mc = null;
这有点多余。因为变量mc
可以在if
或else
子句中进行初始化。所以你可以避免它。
如果您正在初始化if
和else
部分中的两个不同对象,那么您应该在声明时对其进行初始化,以便您知道在程序中稍后对特定变量的期望。
答案 3 :(得分:1)
如果变量的使用在if-else
块之外,那么您的声明就可以了。
但是如果你想在if-else
块中使用变量,你应该在if-else
块中声明并使用它。
使用范围应决定变量的初始化和声明。