【问题标题】:What is the purpose/advantage of a static{} block? [duplicate]static{} 块的目的/优势是什么? [复制]
【发布时间】:2012-09-01 07:00:57
【问题描述】:

可能重复:
Static Initialization Blocks

在查看一些旧代码时,我发现了一些我以前从未见过的相当奇怪的语法。在做了一些研究之后,我现在知道我看到的是一个 static{} 块,它(如果我理解正确的话)是一个在初始化时执行的代码块。

我不明白拥有这样一个功能的优势,或者什么时候可能想要使用它。看起来静态块只包含可以属于任何常规静态方法的常规代码行,那么让它在初始化时自动运行有什么好处(除了为程序员节省一行代码调用方法)?为什么这很重要或有用?

【问题讨论】:

    标签: java static


    【解决方案1】:

    正如他们在Java Tutorials 中所说的:

    如果初始化需要一些逻辑(例如,错误处理或用于填充复杂数组的 for 循环),简单的赋值是不够的。实例变量可以在构造函数中初始化,其中可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java 编程语言包含静态初始化块。

    【讨论】:

      【解决方案2】:

      正如您所说,静态块在初始化时执行。 假设您有一个可能非常复杂的静态字段,例如

      private static List<ThingsDownloadedByTheNet> ls;
      

      只是在做

      private static List<ThingsDownloadedByTheNet> ls = new ArrayList<ThingsDownloadedByTheNet>
      

      还不够,因为您可能还想设置列表元素。 所以,你做一个静态块,在其中你执行一些初始化(在这种情况下你连接到一个服务器并填充列表元素)

      【讨论】:

        【解决方案3】:

        将其视为静态变量的构造函数。它使您有机会在任何人使用它们之前对其进行初始化。

        【讨论】:

        • 也许更重要的区别是可以初始化多个final变量,这是一个方法调用无法做到的。
        • @jthalborn,谢谢。我没有意识到你可以在static{} 块中操作final 变量。结合下面关于初始化复杂对象类型的答案,回答了这个问题。
        【解决方案4】:

        static{} 块在加载类时执行。您可以使用它来初始化静态字段或调用静态方法。您不能使用任何方法来替换此行为,因为类“没有构造函数”。实际上,您可以将其视为“类构造函数”。

        【讨论】:

        • 其实可以使用静态方法来初始化静态成员。
        • 我知道。我的意思是,此类方法不会在类加载时启动,因此如果您希望执行此类代码,则必须从其他代码中调用它们。
        • 您可以调用静态方法来初始化静态成员,例如private static final MY_VAR = someStaticMethod()。 (在类加载时执行)
        • 当然可以,但是这样您需要为每个字段使用一种方法。您不能进行多次初始化。好吧,当然可以,但是这样做会影响代码的可读性和可维护性。
        猜你喜欢
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2010-12-11
        • 2014-08-03
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多