2012-02-19 163 views
12

在Java中,我们使用了静态初始化块:静态初始化良好的编程习惯?

private static final ApiKey API_KEY; 

static { 
    API_KEY = new ApiKey(); 
} 

我想知道的是

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

在此先感谢。

+1

我会评论,因为没有“黑或白”回答你的问题。就我个人而言,我没有发现静态访问​​器是程序员的好朋友。依赖注入是一个非常好的选择,它在测试时也有很大帮助。 – 2012-02-19 09:33:58

+1

我已经看到一个代码,在静态块中开始新线程。 :)这是非常糟糕的。 – 2012-02-19 09:39:38

回答

9

在某种程度上,这是一个品味问题。对我来说,它的罚款,只要:

  • 你保持田间最后,因为你做了
  • 您确保引用的对象是不可变的和线程安全的

静力往往使书写好的测试更难。如果你发现你想要开始修改静态状态,那么你可能需要再看看设计。

考虑看看Google Guice及其非常漂亮的Singleton implementation

当然,如果你的应用程序是一个10行的单类实验,那么这个问题就少了很多。

注意,在你的榜样,你可以简化为:

private static final ApiKey API_KEY = new ApiKey(); 

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

3

你可以完全避免使用静态初始化块使用下面的代码:

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

我喜欢尽可能使用枚举。

而不是

class ApiKey {   
    private static final ApiKey API_KEY; 

    static { 
     API_KEY = new ApiKey(); 
    } 

我会写

enum ApiKey { 
    INSTANCE;