【发布时间】:2021-04-17 13:40:36
【问题描述】:
假设,我有一个类 ProviderService 带有一个 Map<ProviderEnum, Provider> 字段。那么这个类的构造函数如下
@Autowired
ProviderService(ProviderA provA, ProviderB provB, ...) {
map.put(ProviderEnum.A, provA);
map.put(ProviderEnum.B, provB);
...
}
Provider 是一个抽象类继承者,它的注解为@Component。
然后我意识到至少有两种可能更好的方法:
- 使用
EnumMap来实现Map。现在,我使用HashMap。 - 有一个
Provider字段在ProviderEnum枚举并从ProviderService完全删除地图。
第二个选项似乎是更清洁的解决方案,我开始这样写
enum ProviderEnum {
A(/* ?WHAT DO I PUT HERE? */),
B(/* Is it some kind of BeanFactory.getBean(ProviderB.class)? */),
...;
private final Provider provider;
ProviderEnum(Provider provider) {
this.provider = provider;
}
public Provider getProvider() {
return this.provider;
}
}
但是,我不知道应该在这些构造函数中添加什么,因为它肯定不同于使用 @Autowired 的通常情况。
我想我应该考虑使用BeanFactory 但是有没有办法构造函数注入它?我应该现场注入它吗?
还是坚持EnumMap更好?
【问题讨论】:
-
枚举值是隐式静态的,静态是一种糟糕的设计模式。您似乎在这里遇到了一个 XY 问题:使用枚举作为鉴别器的预期目的是什么?
-
@chrylis-cautiouslyoptimistic- 我有一组我想访问的提供程序。我可以依赖
Map<String, Provider>,但枚举似乎是一个更可靠的选择。因此,帖子末尾有一堆问题
标签: java spring dependency-injection enums autowired