首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态成员初始化取决于另一个类的成员的初始化

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

Stack Overflow用户
提问于 2015-09-10 15:42:30
回答 3查看 76关注 0票数 2

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

由于静态成员是在类加载time.So中初始化的,因此会出现不一致的情况,因为当"CLParser“解析并设置"CommonConfig”中的值时,"AbstractStats“类将被加载,其静态成员将被错误地初始化。

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

EN

回答 3

Stack Overflow用户

发布于 2015-09-10 15:49:21

只有在代码中首次使用类的名称时,才会初始化静态成员。因此,第一次使用AbstractStats stats = new AbstractStats();时,类加载器将初始化static成员,然后创建对象。因此,如果您在调用AbstractStats类之前调用依赖类,则该依赖类将在AbstractStats之前加载。

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-10 16:26:10

您必须执行以下任一操作:

  1. 可确保实现正确的访问顺序。您可以在main中完成此操作,方法是将args作为第一步传递给CommonConfig
  2. 使关系对订单具有弹性。让AbstractStats在每次需要有问题的值时调用CommonConfig中的方法。如果有,CommonConfig必须返回真正正确的数据,否则它应该返回安全的默认值。

选项1通常更容易实现,但也很脆弱。对于某些人来说,很容易意外地更改代码并破坏合同,从而导致奇怪且难以找到的bug。

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-10 15:49:09

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32495963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档