如何使用泛型实现ServiceLocator?

时间:2016-06-13 14:12:03

标签: java generics hashmap

有了这个界面:

public interface ServiceLocator {
    <T> void setService(Class<T> klass, Factory<T> factory)

    <T> void setConstant(Class<T> klass, T value)

    <T> T getObject(Class<T> klass)

}

我该如何实施?我的意思是,我如何声明结构数据? 这是对的吗?

private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();

3 个答案:

答案 0 :(得分:0)

private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();

如果你想使用这种结构,你可以这样声明:

private Map<Class<?>, Factory<T>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();

请记住Factory<T>来抓住这个类型。 使用Class可以使用AnyClass.class作为Key

顺便说一句,你可以将所有内容放在一个地图中,如private Map<Class<?>, Object>,如果它是工厂,则可以在get函数中投射它;)

答案 1 :(得分:0)

解决方案:

private Map<Class<?>, Factory<?>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();

-Xlint:unchecked指令添加到编译器选项中。 并@SuppressWarnings("unchecked")了解您需要的方法。在我的情况下是getObject方法。

答案 2 :(得分:0)

Guava有一个用于类似目的的接口:ClassToInstanceMap<B>。 API是:

<T extends B> T getInstance(Class<T> type);
<T extends B> T putInstance(Class<T> type, T value);

查看MutableClassToInstanceMap.java中的实施情况,我们发现它使用HashMap<Class<? extends B>, B>包裹的ConstrainedMap。其MapConstraint使用java.lang.Class.cast()来确保地图中的所有值都是其相应键的合法实例。

由于B通常只是Object,因此实施HashMap最终只是HashMap<Class<? extends Object>, Object>