静态初始化是良好的编程实践吗?

时间:2012-02-19 09:30:34

标签: java static initialization

在Java中,我们使用静态初始化块:

private static final ApiKey API_KEY;

static {
    API_KEY = new ApiKey();
}

我想知道

  • 这是一个很好的编程习惯吗?
  • 我们应该在哪里使用这种模式?

提前致谢。

3 个答案:

答案 0 :(得分:9)

在某种程度上,这是一个品味问题。对我而言,只要:

  • 你保持领域最终,就像你已经完成
  • 确保引用的对象是不可变且线程安全的
静态倾向于使编写好的测试更加困难。如果您发现想要开始修改静态,那么您可能需要再次查看设计。

考虑查看Google Guice及其非常好的Singleton implementation

当然,如果您的应用程序是10行单级实验,那么这个问题要少得多。

请注意,在您的示例中,您可以简化为:

private static final ApiKey API_KEY = new ApiKey();

但这并不总是可行的。也许你省略了一些更复杂的初始化代码?在这种情况下,Guice再次值得一看。

答案 1 :(得分:4)

您可以使用以下代码完全避免使用静态初始化程序块:

private static final ApiKey API_KEY = new ApiKey();

private static final ApiKey API_KEY = createNewApiKey();

如果API密钥创建需要的不仅仅是构造函数调用。这使得代码更具可读性,恕我直言。但这并不重要。

当两个静态字段依赖于相同的初始化代码时,静态初始化程序非常有用:

static {
    // compute some values
    A = somePartOfTheComputedValues();
    B = someOtherPartOfTheComputedValues();
}

但即便如此,A和B也许可以重构为一个对象,它将在一个方法中创建。

答案 2 :(得分:2)

我喜欢尽可能使用枚举。

而不是

class ApiKey {        
    private static final ApiKey API_KEY;

    static {
        API_KEY = new ApiKey();
    }

我会写

enum ApiKey {
    INSTANCE;