考虑如下工厂:
public interface SomeFactory {
public SomeValue createSomething(SomeKey key);
}
此外,我们得到了SomeFactory的一些实现:
public class SomeFactoryImpl implements SomeFactory {
@Override
public SomeValue createSomething(Key key) {
// some logic
}
}
让我们考虑一个想要使用这个工厂的班级:
public class SomeClass{
@Inject
private SomeFactory someFactory;
public String someMethod(Key someKey) {
someFactory.createSomething(someKey);
// some more logic
}
}
在这种情况下,为工厂使用接口有什么好处?我想到了以下几点:
让我们假设我想为我的工厂使用另一种实现:
public class AnotherFactoryImpl implements SomeFactory {
@Override
public SomeValue createSomething(Key key) {
// some logic
}
}
然后将哪个工厂与@Inject-annotation一起使用?注入实现本身更合适,还是我们总是只有一个工厂实现?另一个可能的答案:是否不适合为工厂使用接口?
答案 0 :(得分:1)
使用界面的想法是,您不关心手中的实现,而只关注使用界面的方法,这些方法在所有实现中都很常见。别忘了,你必须使用相同的方法签名,包括覆盖时的相同返回值。
注入机制按名称工作 - 因此,由于您未在@Inject
中指定值,因此它会查找名为someFactory
的对象并将其注入,这很好,因为它&# 39;类型为SomeFactory
的s,无论后面是哪种实现。您可以注入一个特定的实现,如果您处理常见行为或特定行为,这取决于您的用例。要注入的实例必须绑定到您正在使用的范围,或者必须有Producer
,以便在需要注入时创建对象。
编辑:请参阅下面的评论,以获取有关CDI用法的链接以及此用例的更简单架构。