我有一个超类,即包含一些静态成员的"AbstractStats“。其中一个静态成员初始化依赖于另一个类,即"CommonConfig“(包含从命令行传递的配置值)成员,该成员由命令行解析器类设置,即"CLParser”。
由于静态成员是在类加载time.So中初始化的,因此会出现不一致的情况,因为当"CLParser“解析并设置"CommonConfig”中的值时,"AbstractStats“类将被加载,其静态成员将被错误地初始化。
但是,我可以在传递命令行参数后通过调用某些方法显式设置该变量。但是我想知道是否有更好的方法,因为只有在依赖类成员被初始化之后才能初始化静态成员。
发布于 2015-09-10 15:49:21
只有在代码中首次使用类的名称时,才会初始化静态成员。因此,第一次使用AbstractStats stats = new AbstractStats();时,类加载器将初始化static成员,然后创建对象。因此,如果您在调用AbstractStats类之前调用依赖类,则该依赖类将在AbstractStats之前加载。
有关如何加载类和静态成员的更多信息,请查看java class loading。
发布于 2015-09-10 16:26:10
您必须执行以下任一操作:
main中完成此操作,方法是将args作为第一步传递给CommonConfig。AbstractStats在每次需要有问题的值时调用CommonConfig中的方法。如果有,CommonConfig必须返回真正正确的数据,否则它应该返回安全的默认值。选项1通常更容易实现,但也很脆弱。对于某些人来说,很容易意外地更改代码并破坏合同,从而导致奇怪且难以找到的bug。
选项2更好,因为它可以在CommonConfig和AbstractStats中记录,并且具有弹性。
发布于 2015-09-10 15:49:09
尝试使用注解方式,您可以在运行时更改注释值
https://stackoverflow.com/questions/32495963
复制相似问题