我对Java的座右铭是“仅仅因为Java有静态块,并不意味着你应该使用它们”。 除了笑话之外,Java中有很多技巧使得testing成为一场噩梦。 我最讨厌的两个是匿名类和静态块。 我们有很多使用静态块的遗留代码,这些都是我们在编写unit testing时的烦人之处。 我们的目标是能够编写unit testing的类,依赖于这个静态初始化与最小的代码更改。 到目前为止,我的同事的build议是将静态块的主体移动到一个私有的静态方法,并将其staticInit 。 这个方法可以在静态块中被调用。 对于unit testing,依赖于这个类的另一个类可以很容易地使用JMockit来嘲弄staticInit而不做任何事情。 我们来看看这个例子。 public class ClassWithStaticInit { static { System.out.println("static initializer."); } } 将被改为 public class ClassWithStaticInit { static { staticInit(); } private static void staticInit() { System.out.println("static initialized."); } } 所以我们可以在JUnit中进行以下操作。 public class DependentClassTest { public static class MockClassWithStaticInit { public static void staticInit() […]
可能重复: 静态初始化块 考虑下面的代码 : public class Test { { System.out.println("Empty block"); } static { System.out.println("Static block"); } public static void main(String[] args) { Test t = new Test(); } } 我们知道,首先执行静态块,然后是空块。 但问题是,我从来没有能够理解一个空白块的真正效用。 任何人都可以展示一个真实的例子 – 正在使用静态和空的块 静态块和空块都有不同的工具
据我了解,“静态初始化块”是用来设置静态字段的值,如果不能在一行中完成。 但我不明白为什么我们需要一个特殊的块。 例如,我们将一个字段声明为静态的(没有赋值)。 然后写几行代码,生成并赋值给上面声明的静态字段。 为什么我们需要这样的特殊块: static {…} ?