静态初始化块的替代方法是什么?

时间:2013-08-07 07:26:16

标签: java static initialization block

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

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

    static{
        test = "test string";
    }
}

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

5 个答案:

答案 0 :(得分:3)

这个例子并不好。首先它不编译,你不能从静态init块分配实例变量。但即使它是正确的

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

    static{
        test = "test string";
    }

它没有任何意义,因为它等同于

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

但是这个静态init块没有其他选择

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
...

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如果您的班级中有static个成员需要更长时间的处理,那么您将无法绕过static初始值设定项(构造函数)。毕竟这些必须在某处初始化。您可以在类的构造函数中执行此操作,但随后您将重新初始化这些值,每次创建新对象时。
如果您必须处理的不仅仅是简单的初始化,那么没有其他选择 请参阅this帖子和this

答案 3 :(得分:0)

如果您有简单的作业,则可以直接在成员声明中进行作业。不需要单独的块来扩展复杂性和可读性。

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

答案 4 :(得分:0)

恕我直言,不需要静态阻止。

  String test = "test string";

来自docs

  

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

但是

  

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