繁体   English   中英

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

[英]Is Static Initialization Good Programming Practice?

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

private static final ApiKey API_KEY;

static {
    API_KEY = new ApiKey();
}

我在想这个

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

提前致谢。

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

  • 正如你所做的那样,你保持最终的领域
  • 您确保引用的对象是不可变的并且是线程安全的

静态倾向于使编写好的测试变得更难。 如果您发现想要开始修改静态,那么您可能需要再次查看设计。

考虑一下Google Guice及其非常好的Singleton实现

当然,如果您的应用程序是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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM