Java 静态成员初始化的静态块与私有静态方法

Java 静态成员初始化的静态块与私有静态方法,java,methods,static-methods,Java,Methods,Static Methods,静态变量可以用私有静态方法或静态块初始化。两者之间有细微的区别吗?是否存在无法使用静态方法初始化静态成员的情况?我发现后者更具可读性 静态块初始化: private static int NUM_ITER; static { // Operations NUM_ITER = //val from above operations. } 私有静态方法初始化: private static int NUM_ITER = calculateNumIter(); // Some me

静态变量可以用私有静态方法或静态块初始化。两者之间有细微的区别吗?是否存在无法使用静态方法初始化静态成员的情况?我发现后者更具可读性

静态块初始化:

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.
}
我更喜欢第二本,因为它更可读。是否有任何情况我必须首先使用(静态块)

初始化静态成员(最终成员和变量成员)的最佳编码约定/设计是什么?即使从这一点上,我也了解到私有静态方法比静态块有优势


谢谢,

如果两个不同的变量相互依赖并且不能独立初始化,那么静态块是必要的(或者至少是有用的)

例如,假设您需要从一个文件中读取两个值。您可以将这两个值存储在另一个对象中。但是如果你真的想要两个常量,静态块是很有用的

  • 静态初始值设定项
    块(您的1选项)在JVM加载类时执行,甚至在任何
    静态
    变量初始化之前执行

  • 这是一个同时拥有所有静态变量的好地方

  • 您的第二个选项可以通过向初始化方法的参数传递多个参数来选择性地初始化多个
    静态
    变量


  • 我建议使用任何保持代码干净可读的语法:

    • 如果初始化达到一行,最多两行,非常简单的代码,那么使用静态块

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

    • 如有疑问,请使用方法语法和方法名称不仅声明哪个变量,还声明初始化方式(即initializeValueWithRandomNumber())


    因此,静态方法同样可以替换这里的静态块。如果第二个方法是从第一个方法派生出来的,那么这种方法就可以工作。但如果两者都是从一个值派生的,则不是。例如,假设您需要从一个文件中读取两个值。是的,但是如果您的第一个静态方法也将您的第二个静态成员作为arg接受,该怎么办?@LastStar007是的,在这种情况下,它将导致一种依赖性,即静态成员不能在代码中重新洗牌。它还将依赖性放在静态块中,即该块应该在两个成员声明之后,但我同意在本例中,静态块将更整洁,而不是两个静态方法。实际上,我是在回复一个不同的注释,该注释已被修改或删除。在我的示例中,CalculateEnumiter()将在JVM初始化期间调用。不是吗?自从我使用版本2;)以来,我有几次忘记了静态块的静态。