【发布时间】:2021-03-08 13:40:59
【问题描述】:
考虑到一个包含许多实体的项目,我有一个服务需要知道实体的类型才能执行方法。我创造了;
interface Service<T> {
String myMethod(T entity)
Class<T> getResponsibility()
例如;
class FooService<Foo> {
String myMethod(Foo entity) { return 'foo'; }
Class<Foo> getResponsibility() { return Foo.class }
我想创建一个工厂来返回正确的 Bean(我使用的是 Spring Boot)来使用,这是我定义的:
class ServiceFactory {
List<Service<?>> services;
@Autowired
public ServiceFactory(List<Service<?>> services) {
this.services = services;
}
Service getFor(Object entity) {
// Simplified for comprehension purpose
return this.services.stream().filter(service -> service.getResponsibility().equals(entity.getClass()).get();
}
这可行,但我有一个(声纳)警告说我不应该“原始”使用Service 作为我的工厂方法的返回类型。实现这一目标的正确方法是什么?使用通配符是另一个警告。
目标是拥有一个返回正确 Bean 的工厂。最初的设计错了吗?
【问题讨论】:
-
您在调用 get() 时未检查服务是否存在。
-
是的@SimonMartinelli,真正的代码有一个检查并抛出一个异常,但我觉得它不相关
标签: java spring spring-boot generics