静态初始化块有什么替代方案?

3

我曾经参与的项目中,有些开发人员喜欢使用静态初始化块。这种做法的替代方案是什么?使用这种替代方案的缺点是什么?

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

    static{
        test = "test string";
    }
}

据我所知,如果无法在一行内完成静态字段的赋值,则使用静态初始化块来设置静态字段的值。但我不明白为什么我们需要一个特殊的块来完成这个任务。这会降低可读性并引起一些混淆。

5
这个示例代码能编译通过吗?实际上不行,因为你不能从静态块访问非静态字段。 - Nick Holt
我不确定我同意静态块很令人困惑。如果您想为您的情况建议另一种替代方法,我们需要确切了解您对静态初始化块的困难之处。您在帖子中早些时候基本上已经说明了我们需要它们的原因;当初始化不能在一行完成时。 - Richard Tingle
2
我认为Jon Skeet的回答对于这个问题解释得非常好。 - Vincent van der Weele
对于引用的代码,静态初始化程序是没有意义的。 - Richard Tingle
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();
    }
...

2
它可以用于执行在创建类实例之前需要完成的所有任务,甚至包括调用不同方法或仅初始化静态成员。静态块确保这些活动将在类的生命周期中仅执行一次,并且将在与类相关的任何其他操作之前执行。程序员可以依赖静态块,因为它确保该块仅执行一次,并且在执行与该类相关的任何其他活动之前执行。
此外,我认为它并不会影响可读性。当然,这可能因人而异。

1
如果您的类中有需要较长时间处理的static成员,那么您必须使用static初始化器(构造函数)。这些必须在某个地方进行初始化。您可以在类的构造函数中执行此操作,但是每次创建新对象时都会重新初始化这些值。
如果您必须处理的不仅仅是简单的初始化,则没有真正的替代方法。
请参见this帖子和this

0
如果你有简单的赋值语句,可以直接在成员声明中进行赋值,无需使用额外的块来增加复杂性和可读性。
另一种选择是使用延迟初始化。优点是它也可以是任意复杂的,但只在实际需要时执行。但是当然,这仅适用于你的类中有getter的情况。如果直接访问成员,则这将是一个重大改变。

0

在我看来,静态块是没有必要的。

  String test = "test string";

并且来自文档

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

但是

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接