了解局部变量初始化

时间:2015-10-16 06:30:59

标签: java initialization

我正在阅读J. Bloch的有效Java,现在我在关于局部变量初始化的部分中。以下是他所说的:

  

几乎每个局部变量声明都应该包含一个初始化器。如果你还没有足够的信息来初始化   一个明智的变量,你应该推迟宣言,直到你这样做。    此规则的一个 例外涉及try-catch语句。

那么,if-else声明怎么样?我们需要在满足某些条件时初始化变量,如果不满足,则以另一种方式初始化它,如

MyClass mc = null;
if(cond)
   mc = new MyClass();
else
   mc = new MyClass(1);
//use mc

因为J. Bloch没有提及它,它被认为是一种糟糕的编程技术,应该避免吗?

4 个答案:

答案 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可以在ifelse子句中进行初始化。所以你可以避免它。

如果您正在初始化ifelse部分中的两个不同对象,那么您应该在声明时对其进行初始化,以便您知道在程序中稍后对特定变量的期望。

答案 3 :(得分:1)

如果变量的使用在if-else块之外,那么您的声明就可以了。

但是如果你想在if-else块中使用变量,你应该在if-else块中声明并使用它。

使用范围应决定变量的初始化和声明。