【问题标题】:static member initialization depending upon initialization of member of another class静态成员初始化取决于另一个类的成员的初始化
【发布时间】:2015-09-10 07:42:30
【问题描述】:

我有一个超类,即“AbstractStats”,其中包含一些静态成员。其中一个静态成员初始化依赖于另一个类,即“CommonConfig”(包含从命令行传递的配置值)成员,该成员由命令行解析器类“CLParser”设置。

由于静态成员是在类加载时初始化的。因此,当“CLParser”解析并设置“CommonConfig”中的值时,会发生不一致,“AbstractStats”类将被加载,其静态成员将初始化错误。

但是,我可以在通过调用某些方法传递命令行参数之后显式设置变量。 但我想知道是否有更好的方法可以在初始化依赖类成员之后初始化静态成员。

【问题讨论】:

    标签: java static initialization


    【解决方案1】:

    静态成员仅在您的代码中第一次使用类的名称时才被初始化。因此,当您第一次拥有AbstractStats stats = new AbstractStats(); 时,类加载器将初始化static 成员,然后创建对象。所以如果你在AbstractStats类之前调用​​依赖类,那么依赖类会在AbstractStats之前加载。

    查看java class loading 了解有关如何加载类和静态成员的更多信息。

    【讨论】:

      【解决方案2】:

      您必须:

      1. 确保获得正确的访问顺序。您可以通过将args 传递给CommonConfig 作为第一步,在main 中执行此操作。
      2. 使关系有弹性以适应秩序。让AbstractStats 在每次需要相关值时调用CommonConfig 中的方法。 CommonConfig 必须返回真正正确的数据,否则它应该返回一个安全的默认值。

      选项1 通常更容易实现但很脆弱。有人很容易意外更改代码并破坏合同,从而导致奇怪且难以发现的错误。

      选项2 更好,因为它可以记录在CommonConfig 和AbstractStats 中并且具有弹性。

      【讨论】:

        【解决方案3】:

        尝试使用注释方式,您可以在运行时更改注释值

        【讨论】:

          猜你喜欢
          • 2011-07-18
          • 1970-01-01
          • 2015-05-18
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 1970-01-01
          相关资源
          最近更新 更多