java - 在另一个实例变量中使用自动装配参数
问题描述
我有一个实现接口的服务。我现在想写一个映射器,基本上就是说,当我传入这个枚举类型时,使用那个服务。这就是我所拥有的
@Service
MyService implements Service {}
@Component
@RequiredArgsConstructor
MyMapper implements Mapper<Enum, Service> {
private final MyService myService;
private ImmutableMap<Enum, Service> MAPPER = ImmutableMap.<MyEnum, MyService>builder()
.put(Enum.A, myService)
.build();;
@Override
public Service map(Enum input) {
return MAPPER.get(input);
}
}
但是,这似乎行不通。我认为我不允许使用(自动装配的)实例变量来实例化另一个实例变量。
为了解决这个问题,我现在使用了单例模式。
@Service
MyService implements Service {}
@Component
@RequiredArgsConstructor
MyMapper implements Mapper<Enum, Service> {
private final MyService myService;
private ImmutableMap<Enum, Service> MAPPER = null;
@Override
public Service map(Enum input) {
if(MAPPER == null){
MAPPER = createMapper();
}
return MAPPER.get(input);
}
private ImmutableMap<Enum, Service> createMapper(){
return ImmutableMap.<MyEnum, MyService>builder()
.put(Enum.A, myService)
.build();;
}
}
这似乎可行,但我想知道是否有其他选择可以解决这个问题。
解决方案
您遇到了关于最终变量的极端情况;即使它被标记为 final,映射的初始化语句在实例初始化块之前运行(否则这将很有用),实例初始化块在对变量进行赋值的构造函数体之前运行。
我不确定您为什么要创建一个映射只是为了保存一个单例值,但是您需要在构造函数体内分配映射。如果您出于某种原因真的想要此设置,我的建议是这样做:
private final Map<Enum, Service> MAPPER;
public MyMapper(MyService myService) {
MAPPER = Map.of(Enum.A, myService);
}
推荐阅读
- c - 没有指针的奇怪输出
- python - 回答问题后代码重复为什么?
- angular - 如何在 HttpGet 中将对象数组从 Angular 发送到 Web API Core?
- python - 如何让 Python Chatbot 调用特定功能?
- amazon-web-services - EC2 在 CloudFront 后面使用 HTTPS 运行 NGINX?
- javascript - 将响应与文件下载和重定向相结合
- c# - 矩阵中从上到下的最大和路径
- python - 获取数据框标题和每列 i 中的所有唯一值
- python - 使用 openid 切换到 Oauth 2.0 的 API 调用
- react-native - React native - Flatlist onPress 正在返回所有数据集,而不仅仅是选择的数据集