2012-07-23 155 views
9

私有静态方法的静态变量可以与私有静态方法或用静块进行初始化。两者之间有什么细微差别?有什么情况我不能使用静态方法来初始化静态成员?我发现后者更具可读性。静块VS静态成员初始化

静块初始化:

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. 
} 

我喜欢第二之一,因为它是更具有可读性。有什么情况我只能使用第一个(静态块)?

什么是初始化静态成员(决赛以及变量)的最佳编码约定/设计?即使从这个thread我学到私人静态方法有优势的静态块。

感谢,

+0

自从我使用版本2以来,我已经为静态块遗忘了几次静态;)。 – Stefan 2012-07-23 20:34:21

回答

2

静态块将是必要的(或至少是有用的),如果两个不同的变量是interdependant并且不能独立地初始化。

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

+0

因此,这里静态方法可以替代静态块。 – Mohan 2012-07-23 18:53:47

+0

如果第二个是从第一个派生的,那么这将起作用。但是,如果两者都来源于单一的价值,那就不是。例如,假设您需要从文件中读取两个值。 – 2012-07-23 18:56:51

+1

是的,但是如果你的第一个静态方法也接受你的第二个静态成员为arg呢? – LastStar007 2012-07-23 18:56:55

1
  1. static Initializer块(你的选项1)执行时JVM装载该类,甚至之前任何static变量被初始化。

  2. 它的一个好地方,拥有所有的静态变量的一次。

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

+0

在我的示例中,将在JVM初始化期间调用calculateNumIter()。不是吗? – Mohan 2012-07-23 19:20:53

+0

雅......它会...... – 2012-07-23 19:23:32

2

我会建议使用任何语法保持了代码干净和可读性:

  • 如果初始化达一个,最多两个代码非常简单的线条,然后用静态块去;

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

  • 有疑问,请使用方法语法并使用方法名来声明不仅是哪个变量,而且还要声明如何初始化(即initializeValueWithRandomNumber());