3

我的项目中有一些喜欢静态初始化块的开发人员。有什么替代方法?这种替代方案的缺点是什么?

public class BlockTest {
    String test = new String();

    static{
        test = "test string";
    }
}

据我了解,如果不能在一行中完成,则静态初始化块用于设置静态字段的值。但我不明白为什么我们需要一个特殊的块。这会导致可读性降低和一些混乱。

4

5 回答 5

3

例子不好。首先它不能编译,你不能从静态初始化块分配一个实例变量。但如果它是正确的

public class BlockTest {
    static String test = new String();

    static{
        test = "test string";
    }

这是没有意义的,因为它相当于

public class BlockTest {
    static String test = "test string";

但是这个静态初始化块别无选择

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
...
于 2013-08-07T07:32:53.427 回答
2

它可用于执行第一次引用类时需要完成的所有任务,甚至在创建类的实例之前。它可以调用不同的方法或只是初始化静态成员。静态块确保这些活动在类的生命周期中只执行一次,并且将在与该类相关的任何其他操作发生之前执行。
程序员可以依赖静态块,因为可以确保该块只执行一次,并且在执行与该类相关的任何其他活动之前执行。

此外,我认为它根本不会妨碍可读性。这又可能因人而异。

于 2013-08-07T07:31:30.593 回答
1

如果您static的班级中有成员需要更长的处理时间,那么您将无法绕过static初始化程序(构造函数)。毕竟这些必须在某个地方初始化。您可以在类的构造函数中执行此操作,但是每次创建新对象时都会重新初始化这些值。
如果您必须处理的不仅仅是简单的初始化,那么就没有真正的选择。
看到这个帖子和这个

于 2013-08-07T07:31:33.180 回答
0

如果你有简单的赋值,你可以直接在成员声明中进行赋值。不需要一个单独的块来扩展复杂性和可读性。

另一种方法是使用延迟初始化。优点是它也可以是任意复杂的,但仅在实际需要时才执行。但当然,这只有在你的课程中有吸气剂时才有效。如果您直接访问成员,那么这将是一个很大的变化。

于 2013-08-07T07:31:27.257 回答
0

恕我直言,不需要静态块。

  String test = "test string";

并且来自文档

实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包括静态初始化块。

注意:没有必要在类定义的开头声明字段,尽管这是最常见的做法。只需要在使用它们之前声明和初始化它们。

于 2013-08-07T07:32:12.627 回答