【问题标题】:Static field initializer is being invoked after static method execution静态方法执行后调用静态字段初始化器
【发布时间】:2015-11-19 14:43:33
【问题描述】:

我有一个只有静态成员的类,设计如下:

public class Clazz {

    public static final Foo foo = FooFactory.createFoo();

    private static Bar bar;

    public static void prepare() {
        bar = new Bar(foo);
    }
}

当调用 Clazz.prepare() 时,我可以看到 foo 在 bar 初始化时为空。据我所知,静态初始化程序应该在调用类的任何静态方法之前调用。因此, foo 在调用 prepare() 时应该已经被初始化。 我错过了什么吗?

【问题讨论】:

  • FooFactory.createFoo() 是做什么的?
  • FooFactory.createFoo() 必须返回 null
  • 基本上,它确实返回 new Foo();
  • @basme 基本上不够好,class initialisation can be tricky。您能否发布一个显示奇怪行为的完整代码示例?
  • 请添加Bar类和FooFactory类的代码

标签: java static static-methods static-members jls


【解决方案1】:

FooFactory.createFoo() 必须返回 null

【讨论】:

  • 这也可能是根据Clazz.foo返回的值造成的。
  • 另一个问题是,如果 Clazz.prepare() 是从 FooFooFactoryBar 的类初始化程序调用的。
  • @biziclop 确实是的,但我们必须看到 FooFactory 才能知道。
【解决方案2】:

实际上,Foo 的初始化程序也调用了 Clazz.prepare()。这就是原因。感谢@biziclop 的想法。

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2016-06-28
    • 2014-10-06
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多