静态初始化良好的编程习惯?
问题描述:
在Java中,我们使用了静态初始化块:静态初始化良好的编程习惯?
private static final ApiKey API_KEY;
static {
API_KEY = new ApiKey();
}
我想知道的是
- 它是一个良好的编程习惯?
- 我们应该在哪里使用这种模式?
在此先感谢。
答
在某种程度上,这是一个品味问题。对我来说,它的罚款,只要:
- 你保持田间最后,因为你做了
- 您确保引用的对象是不可变的和线程安全的
静力往往使书写好的测试更难。如果你发现你想要开始修改静态状态,那么你可能需要再看看设计。
考虑看看Google Guice及其非常漂亮的Singleton implementation。
当然,如果你的应用程序是一个10行的单类实验,那么这个问题就少了很多。
注意,在你的榜样,你可以简化为:
private static final ApiKey API_KEY = new ApiKey();
这并不总是可能的,但。也许你已经省略了一些更复杂的初始化代码?在这种情况下,Guice会再次值得一看。
答
你可以完全避免使用静态初始化块使用下面的代码:
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也许可以重构为一个单一的对象,这将在一个单一的创建:当两个静态字段依赖于相同的初始化代码
的静态初始化是有用方法。
答
我喜欢尽可能使用枚举。
而不是
class ApiKey {
private static final ApiKey API_KEY;
static {
API_KEY = new ApiKey();
}
我会写
enum ApiKey {
INSTANCE;
我会评论,因为没有“黑或白”回答你的问题。就我个人而言,我没有发现静态访问器是程序员的好朋友。依赖注入是一个非常好的选择,它在测试时也有很大帮助。 – 2012-02-19 09:33:58
我已经看到一个代码,在静态块中开始新线程。 :)这是非常糟糕的。 – 2012-02-19 09:39:38