2015-10-16 136 views
4

我正在阅读J. Bloch的有效Java,现在我在关于局部变量初始化的章节中。这是他所说的:了解局部变量初始化

几乎每个局部变量声明都应该包含一个初始化方法。如果你还没有足够的信息来初始化 一个明显的变量,那么你应该推迟声明,直到你做到。 其中一个此规则的例外涉及try-catch语句。

那么,if-else声明呢?我们需要初始化变量只有当某些条件得到满足,并且intialize它以另一种方式,如果它不是,就像

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

,因为它不是由布洛赫所提到的,是它看作是一个不好的编程技术应该避免?

+2

我不确定“唯一例外”是指“唯一例外”还是“例外之一”。我想这是后者。 – mezzodrinker

+0

@ flashdrive2049也许,但不是在这一节,然后... –

回答

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

+0

确实,很好的建议。非常感谢。 –

1
MyClass mc = null; 

这是多余的。因为变量mc任何方式要在ifelse子句中初始化。所以你可以避免它。

如果你正在初始化ifelse部分中的两个不同的对象,那么你应该在声明的时候初始化它,这样你就可以知道在程序的某个特定变量中期待什么。

1

如果变量的使用超出了if-else块,那么您的声明是正确的。

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

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

2

你必须初始化一个变量,不管它在什么时候都可以使用。

如果编译器分析检测到变量在可能被使用之前被初始化,您可以定义一个变量而无需初始化。

例如

int a; 
if (...) { a = 0; } 
else { a = 1;} 

就可以了。然而,

int a; 
if (...) { a = 0; } 

会导致编译器错误,因为条件可能不会变为true,在这种情况下'a'仍未初始化。

我个人更喜欢'?'在你的代码中显示运营商的情况:

MyClass mc = cond ? new MyClass() : new MyClass(1); 

如果你需要一个在初始化范围(在的if/else块)外的参考“MC”你必须这样做的。它不知道这被认为是不好的做法。但是,在具体情况下,可能有更好的解决方案,但如果不知道整个代码就难以说明问题。