如何通过从另一个类调用方法来初始化final字段?

时间:2015-03-09 14:28:54

标签: java spring autowired

一个具有声明服务的类RestitController

@Autowired
private RestitService restitService;

我想声明一个类变量(因为它将被RestitController的许多方法使用),并用RestitService方法的结果填充它。

问题是当我写一些像

这样的东西
private final HashMap<K, V> map = restitService.makeMap();

我得到NullPointerException,因为此时restitServicenull

还有其他方法来组织我的代码吗?我真的很想避免在每次需要地图时都调用该方法。

感谢您的帮助,对不起我粗略的英语。

编辑:Luigi的解决方案很好。 只有一件事:我的HashMap在我的代码中实际上是一个WeakHashMap。映射已在Tomcat的开头正确加载,但一旦使用它的方法被调用它就是空的。我将类更改为HashMap,问题就消失了。猜猜垃圾收集者是不合时宜的清洁工作。

2 个答案:

答案 0 :(得分:7)

使用构造函数注入

private RestitService restitService;
private final HashMap<K, V> map;

@Autowired
public RestitController(RestitService restitService) {
    this.restitService = restitService;
    this.map = restitService.makeMap();
}

答案 1 :(得分:0)

您也可以使用@PostConstruct方法来执行此操作。

@Autowired
private RestitService restitService;
private final HashMap<K, V> map=new HashMap<K, String>();

@PostConstruct
    public void initIt() throws Exception {
      this.map.putAll(restitService.makeMap());
}