2012-04-17 38 views
3

所以我确实读过了什么以及何时执行静态initalizer的线索。 Static initializer in Java。但是我遇到了一些别人写的旧代码,似乎无法理解他为什么会像他那样使用它。Java静态初始化器似乎是多余的

我的班级:

public class ClassA extends Thread { 
    .... private vars .... 

    private static Config config; 

    static { 
    config = null; 
    } 

    public ClassA(Config config) { 
    ClassA.config = config; 
    } 
} 

他为什么不只是这样做?

public class ClassA extends Thread { 
    .... private vars .... 

    private static Config config = null; 

    public ClassA(Config config) { 
    ClassA.config = config; 
    } 
} 

我的理解是静态initalizer权的构造函数之前和之后得到调用的类被redenered,因此它设置配置=>空,而如果我不使用静态initalizer,实例变量得到initalizer超。那么这两个班级不会做同样的事情吗?

回答

5

这些类做同样的事情,但更复杂的静态初始化不能总是在一行上完成。

+0

所以可以说我可以使用第二个实现并且不会改变任何功能。 – Churk 2012-04-17 15:21:00

+0

也许该类的作者首先做了一些更复杂的初始化,然后删除它,然后不删除静态初始化器。但这只是一个猜测。无论如何,你的答案是准确无误的(+1)。 – 2012-04-17 15:21:16

+0

@Churk在这种特殊情况下?是。 – 2012-04-17 15:21:17

3

第一个示例中的静态初始化器对该类的行为没有任何影响。你可以完全删除它,没有什么会改变。

1

为什么我写x = x + 1而不是x++?没有特别的原因,我只是这样做的。我认为这里是一样的,因为2基本相同,并不重要。另一方面,如果将来某个时候需要更复杂的初始化,那么他可能无法在单行代码中完成这一操作。

0

无论ClassA有多少个实例,静态块只会在加载类时初始化配置一次。

哪个解决方案并不重要,它只是一个技术性问题,我看到有人使用这两种解决方案。

0

两者都在做同样的事情,这是设计选择的问题。