了解局部变量初始化
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
无论如何都会在 if
或 else
子句中初始化。所以你可以避免它。
如果您在 if
和 else
部分初始化两个不同的对象,那么您应该在声明时初始化它,这样您就知道稍后在程序中对特定变量的期望。
如果变量的使用在 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.
更有效且故障安全
我正在阅读 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
无论如何都会在 if
或 else
子句中初始化。所以你可以避免它。
如果您在 if
和 else
部分初始化两个不同的对象,那么您应该在声明时初始化它,这样您就知道稍后在程序中对特定变量的期望。
如果变量的使用在 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.
更有效且故障安全