【问题标题】:What is the alternative to a static initialization block?静态初始化块的替代方法是什么?
【发布时间】:2013-08-08 11:04:23
【问题描述】:

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

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

    static{
        test = "test string";
    }
}

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

【问题讨论】:

  • 示例代码还能编译吗?这不应该是因为您无法从静态块访问非静态字段。
  • 我不确定我是否同意静态块令人困惑。为了针对您的情况提出替代方案,我们需要准确了解静态初始化程序块的难度。您几乎在帖子的前面说明了为什么我们需要它们;当无法在一行中完成初始化时
  • 我认为Jon Skeet's answerthis question 解释得很好。
  • 对于引用的代码当然是静态初始化器我们毫无意义

标签: java static initialization block


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

          String test = "test string";
        

        来自docs

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

        但是

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

        【讨论】:

          【解决方案5】:

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

          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-08
            • 1970-01-01
            • 2010-09-25
            • 2012-01-01
            • 1970-01-01
            • 2012-07-22
            • 2011-01-26
            • 1970-01-01
            • 2012-01-21
            相关资源
            最近更新 更多