了解局部变量初始化

Understanding local variable initialization

我正在阅读 J. Bloch 的 effective Java,现在我正在阅读有关局部变量初始化的部分。他是这样说的:

Nearly every local variable declaration should contain an initializer. If you don’t yet have enough in formation to initialize a variable sensibly, you should postpone the declaration until you do. One exception to this rule concerns try-catch statements.

那么,if-else 语句呢?我们只需要在满足某些条件时才初始化一个变量,如果不满足则用另一种方式初始化它,比如

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

既然 J. Bloch 没有提到它,它是否被认为是一种糟糕的编程技术并且应该避免?

MyClass mc = null;

这有点多余。 因为变量 mc 无论如何都会在 ifelse 子句中初始化。所以你可以避免它。

如果您在 ifelse 部分初始化两个不同的对象,那么您应该在声明时初始化它,这样您就知道稍后在程序中对特定变量的期望。

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

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

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

无论如何都必须初始化变量才能使用它。

如果编译器分析检测到一个变量在使用前被初始化,您可以定义一个没有初始化的变量。

例如

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 块),您必须那样做。它不知道这被认为是不好的做法。但是,在您的具体情况下,可能会有更好的解决方案,但如果不了解整个代码就很难说。

在我看来,最干净的方式应该是:

final MyClass mc;
if (cond) {
   mc = new MyClass();
} else {
   mc = new MyClass(1);
}
//use mc

因为 final 关键字将确保变量将始终只初始化一次(有关详细说明,请参阅您的书 第 15 项:最小化可变性,第 ~ 73).

而这在通常的 try-catch 语句中是做不到的。

此外 always use curly braces.

更有效且故障安全