初始化的静态变量变为null

问题描述 投票:0回答:1

我有一个简单的课程,如下所示:

class MyClass {
  private static SomeClass object = null;

  public void init(Someclass injectedObject) {
    object = injectedObject;
  }
}

我在 Guice 模块中初始化这个类:

public class MyModule extends AbstractModule {

  @Provides @Singleton
  public SomeClass getStuff() {
    SomeClass injectObject = new SomeClass();
    MyClass.init(injectObject);
  }

}

但是当我打包 jar 并将其作为作业提交到 Flink 运行时时,我收到一条错误消息

NullPointerException: object in MyClass in null

我什至尝试将其添加到我的方法中:

public static void main(String[] args) {
  // Guice stuff
}

public void doStuff() {
  MyClass.init(injectedObject);
}

我错过了什么吗?为什么已初始化的变量在 Flink 运行时会重置为 null?

java apache-flink guice
1个回答
0
投票

有一种更好的方法使用 Guice 注入静态变量:

public class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(SomeClass.class).in(Scopes.SINGLETON);
    requestStaticInjection(MyClass.class);
  }
}

class MyClass {
  @Inject private static SomeClass object;
  // no init method needed
}

但是,如果您可以完全省略

static
字段,那就更好了:

public class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(SomeClass.class).in(Scopes.SINGLETON);
    bind(MyClass.class);
  }
}

class MyClass {
  private final SomeClass object;
  
  @Inject 
  MyClass(SomeClass object) {
    this.object = object;
  }
}

现在,您可以通过注入或直接从

MyClass
请求它们来请求
injector
实例,并且它们都可以访问同一个
SomeClass
实例。

© www.soinside.com 2019 - 2024. All rights reserved.