静态块 vs 私有静态方法用于静态成员初始化

13

静态变量可以使用私有静态方法或静态块进行初始化。这两者之间是否存在微妙差别?是否有任何情况我不能使用静态方法来初始化静态成员?我发现后者更易读。

静态块初始化:

private static int NUM_ITER;
static {
    // Operations
    NUM_ITER = //val from above operations.
}

私有静态方法初始化:

private static int NUM_ITER = calculateNumIter();

// Some method comment on how we are calculating.
private static int calculateNumIter()
{
    // Operations.
    return //value_from_operations.
}

我更喜欢第二种方式,因为它更易读。是否有仅能使用第一种(静态块)的情况?

针对初始化静态成员变量(包括final和变量),最好的编码规范/设计是什么?在这个帖子中,我了解到私有静态方法比静态块有优势。

谢谢,


我有几次忘记为静态块添加 static,自从我使用版本2以后就再也没有忘记过了 ;)。 - Stefan
3个回答

3
静态块在两个不同的变量相互依赖且不能独立初始化时是必要的(或至少有用的)。
例如,假设您需要从文件中读取两个值。您可以将两个值存储在一个额外的对象中。但如果您真的想要两个常量,那么静态块就很有用。请注意保留HTML标记。

所以,静态方法可以在这里替换静态块。 - Mohan
如果第二个值是从第一个值派生出来的,那么这个方法可以工作。但是如果两个值都是从单个值派生出来的,那么这个方法就不行了。比如说,假设你需要从文件中读取两个值。 - JB Nizet
1
没错,但如果你的第一个静态方法也接受你的第二个静态成员作为参数呢? - LastStar007
@LastStar007 是的,在这种情况下,它会导致静态成员无法在代码中重新排序的依赖关系。此外,它还会在静态块中放置一个依赖关系,即该块应在声明这两个成员之后,但我同意在这种情况下使用静态块会更整洁,而不是使用两个静态方法。 - Mohan
我实际上是在回复另一个评论,但那个评论已经被修改或删除了。 - LastStar007

2

我建议使用能让你的代码更干净和易读的语法:

  • 如果初始化只需要一行或两行简单的代码,那么使用静态块;

  • 如果初始化是一个复杂的操作,那么最好使用一个有好名字的方法;

  • 如果不确定,就用方法语法,并使用方法名称来声明不仅哪个变量,而且还有如何初始化(即initializeValueWithRandomNumber())。


1
  1. static Initializer块(您的第一选项)在JVM加载类时执行,甚至在任何static变量初始化之前。

  2. 这是一个很好的地方,可以一次性拥有所有静态变量。

  3. 您的第二个选项可以选择使用,通过将多个参数传递给初始化方法的参数来初始化多个static变量。


在我的例子中,calculateNumIter()方法将在JVM初始化期间被调用。不是吗? - Mohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接