我可以想到几种使用 CDI 解决此问题的方法。
首先,如果isSuitableFor 方法与您列出的一样简单,您可以将Qualifier 与@Nonbinding 值一起用于列出的int,然后只需查找具有该限定符值的实现即可。假设限定符是@Vertices,Triangle 的值是3,那么限定符变为:
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Vertices {
@Nonbinding int value();
}
三角形变成:
@Vertices(3)
public class Triangle implements Polygon{
}
您可以通过以下方式获得对它的引用:
@Inject
@Vertices(3)
private Polygon polygon;
或者您可以为顶点创建一个AnnotationLiteral 并通过实例手动查找它。
另一种方法是遍历所有实例,如下所示:
@Inject
@Any
private Instance<Polygon> polygons;
for(Polygon p : polygons) {
if(p.isSuitableFor(x)) {
// do something.
}
}
这假设所有的多边形都是注册的 bean。对于大量多边形,这会很慢。
第三种方法是使用事件,而不是限定类,而是限定观察者方法。例如
@Inject
private Event<SomePayload> somePayload;
// later on
somePayload.select(new VerticesLiteral(3)).fire(somePayload);
// and the observer method in Triangle
public void handle(@Observes @Vertices(3) SomePayload somePayload) { ... }
// and in square
public void handle(@Observes @Vertices(4) SomePayload somePayload) { ... }