2015-09-10 42 views
2

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

由于静态成员是在类加载时初始化的,所以会出现不一致,就像“CLParser”解析并设置“CommonConfig”中的值一样,“AbstractStats”类将被加载,并且其静态成员会已被错误地初始化。

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

回答

0

尝试使用注解的方式,你可以在运行时更改的注释值时,在你的代码被用于第一次类的名称

1

静态成员仅初始化。因此,您第一次有AbstractStats stats = new AbstractStats();时,类加载器将初始化static成员,然后创建该对象。因此,如果您在AbstractStats类之前调用​​依赖类,则该依赖类将在AbstractStats之前加载。

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

1

您必须:

  1. 确保正确的访问顺序来实现的。您可以在main中做到这一点,将args转换为CommonConfig作为第一步。
  2. 使关系具有顺序弹性。每次需要相关值时,请AbstractStatsCommonConfig中调用方法。 CommonConfig必须返回真实的正确数据,否则它应该返回一个安全的默认值。

选项1通常更容易实现但易碎。对于有人意外更改代码并破坏合同造成奇怪且难以发现的错误,这将非常容易。

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