静态成员初始化取决于另一个类的成员的初始化

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您必须:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于静态成员初始化取决于另一个类的成员的初始化的主要内容,如果未能解决你的问题,请参考以下文章

静态构造函数, 静态成员初始化/调用顺序

类的静态数据成员初始化问题

C++中类里面定义 静态成员变量的问题

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺

java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

Java类的静态成员静态代码块普通成员普通代码块构造方法初始化执行的顺序