前几天我偶然发现了一些使用不便,java.util.ServiceLoader
并且在我心中形成了一些问题。
假设我有一个通用服务:
public interface Service<T> { ... }
我无法明确告诉只ServiceLoader
加载具有特定泛型类型的实现。
ServiceLoader<Service<String>> services =
ServiceLoader.load(Service.class); // Fail.
我的问题是:有哪些合理的方法可以ServiceLoader
安全地加载通用服务的实现?
在提出上述问题之后,在 Paŭlo 回答之前,我设法想出了一个解决方案。
public interface Service<T> { ...
// true if an implementation can handle the given `t' type; false otherwise.
public boolean canHandle(Class<?> t) { ...
public final class StringService implements Service<String> { ...
@Override public boolean canHandle(Class<?> t) {
if (String.class.isAssignableFrom(type))
return true;
return false;
}
public final class DoubleService implements Service<Double> { ...
// ...
public final class Services { ...
public static <T> Service<T> getService(Class<?> t) {
for (Service<T> s : ServiceLoader.load(Service.class))
if (s.canServe(t))
return s;
throw new UnsupportedOperationException("No servings today my son!");
}
更改boolean canServe(Class<?> t)
为boolean canServe(Object o)
并<T> Service<T> getService(Class<?> t)
以相同的方式更改可能更具动态性(我自己使用后者,因为一boolean canHandle(T t)
开始我的界面上有一个方法。)