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

Java 静态初始化是好的编程实践吗?,java,static,initialization,Java,Static,Initialization,在Java中,我们使用静态初始化块: private static final ApiKey API_KEY; static { API_KEY = new ApiKey(); } 我想知道 这是一个好的编程实践吗 我们应该在哪里使用这种模式 提前谢谢。在某种程度上,这是口味的问题。对我来说,只要: 就像你做的那样,你要保持场地决赛 确保引用的对象不可变且线程安全 静态倾向于使编写好的测试变得更加困难。如果您发现您想要开始修改静态,那么您可能需要再次查看设计 考虑一下看一看,

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

private static final ApiKey API_KEY;

static {
    API_KEY = new ApiKey();
}
我想知道

  • 这是一个好的编程实践吗
  • 我们应该在哪里使用这种模式

提前谢谢。

在某种程度上,这是口味的问题。对我来说,只要:

  • 就像你做的那样,你要保持场地决赛
  • 确保引用的对象不可变且线程安全
静态倾向于使编写好的测试变得更加困难。如果您发现您想要开始修改静态,那么您可能需要再次查看设计

考虑一下看一看,它非常漂亮

当然,如果你的应用程序是一个10行的单班实验,那么这就不那么重要了

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

private static final ApiKey API_KEY = new ApiKey();

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

您可以通过使用以下代码完全避免使用静态初始值设定项块:

private static final ApiKey API_KEY = new ApiKey();

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

当两个静态字段依赖于相同的初始化代码时,静态初始值设定项很有用:

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;

我将发表评论,因为你的问题没有“黑或白”的答案。就我个人而言,我并不认为静态访问器是程序员的好朋友。依赖项注入是一个非常好的替代方案,在测试方面也有很大帮助。我见过一段代码,其中新线程在静态块中启动。:)非常糟糕。
enum ApiKey {
    INSTANCE;