【发布时间】:2017-02-17 15:15:52
【问题描述】:
我最近(两次)遇到了以下问题 - 是否可以在类路径中找到通用接口的特定实现?为了可视化这一点,请考虑以下代码 sn-ps:
public interface Cleaner<T extends Room> {}
public class KitchenCleaner implements Cleaner<Kitchen> {}
public class BathroomCleaner implements Cleaner<Bathroom> {}
现在 - 是否有可能有以下方法?:
public static <T extends Room> findCleanerServiceForRoomType(T room) {
return ???
}
返回 Kitchen 类的 KitchenCleaner 和 Bath 类的 BathroomCleaner?当然我希望它可以扩展,这样当添加新的房间和服务类型时,这个方法仍然有效......所以没有开关或 ifs :)
【问题讨论】:
-
如果它们是你的类,你可以向接口添加一个 getType() 方法,你可以在你的 .jar 文件中包含一个 SPI 描述符并使用java.util.ServiceLoader。
-
主要问题是找到类路径上的所有类。 Java 没有对此的内置支持。但是你可以自己做,通过枚举类路径上的所有类;或找到一些这样做的图书馆。然后,对于每个类,您可以使用反射来查看它是否实现了某些特定的
CleanerT -
通常情况下,所谓的重复不是同一个问题,并且会阻止发布有用的答案。我的建议:没有对此的自动支持,所以创建一个包含
Map<Class,Class>的 CleanerRegistry(或者可能类似于Map<Class<R extends Room>, Class<C extends Cleaner>>)。