我是 java 的新手,下面是我的映射器接口(interface)定义:
public interface CourseMapper {
Course map(JsonObject courseJson);
List<Course> map(JsonArray coursesJson);
}
public interface LocationMapper {
Location map(JsonObject locationJson);
List<Location> map(JsonArray locationsJson);
}
下面是两个类:
public interface Location {
Long id();
String name();
Location mutate(Long id);
}
public interface Course {
Long id();
String name();
Course mutate(Long id);
}
我需要的是基于一个key(String),我需要调用相应Mapper
的相应map()
函数。例如,如果 key=="location"
,我需要调用 LocationMapper
,如果 key=="course"
,我需要调用CourseMapper
(针对gson Mapper)......等等。
我尝试使用 Factory Pattern 进行相同的操作,但当输出类型不同时,它似乎不起作用。有谁知道如何在不明显复杂化 if-else 阶梯的情况下实现同样的目标。
最佳答案
最简单的方法是使用 Map<String, Object>
将您的映射器存储在:
private Map<String, Object> mappers;
public <T> T getMapper(String key, Class<T> mapperType) {
Object mapper = mappers.get(key);
// code for when mapper == null
if (mapperType.isAssignableFrom(mapper)) {
return (T) mapper;
} else {
// code for when mapper is of wrong type
}
}
但是您会注意到,这放弃了静态类型检查,因此任何类型不匹配只能在运行时发现。
一种更复杂的方法可以省去(某种程度上)静态类型检查。它基本上将结果类型与字符串键联系起来:
private static class MapperKey<T> {
private final String key;
public MapperKey(String key) {
this.key = key;
}
}
private Map<String, Object> mappers;
public static final MapperKey<CourseMapper> COURSE_KEY = new MapperKey<CourseMapper>("course");
public <T> void addMapper(MapperKey<T> mapperKey, T mapper) {
mappers.put(mapperKey.key, mapper);
}
public <T> T getMapper(MapperKey<T> mapperKey) {
Object mapper = mappers.get(mapperKey.key);
// code for when mapper == null
return (T) mapper;
}
然而,这种方法取决于用户使用 MapperKey
的预定义常量s,或创建正确的 key (相应 key 的正确类型参数)。
最后,如果你能更换你的 CourseMapper
和 LocationMapper
与此接口(interface):
public interface Mapper<T> {
T map(JsonObject courseJson);
List<T> map(JsonArray coursesJson);
}
如果每种输出类型只需要一个映射器,则可以使用输出类型作为键:
private Map<Class<?>, Mapper<?>> mappers;
public <T> void addMapper(Class<T> outputType, Mapper<T> mapper) {
mappers.put(outputType, mapper);
}
@SuppressWarnings("unchecked")
public <T> T getMapper(Class<T> outputType) {
return (T) mappers.get(outputType);
}
关于java - java中输出类型不同时的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220554/