我有一组数据对象,它们对应于RDMS表中的行,如ClassA中的那样 - > TableA的行 ClassB - > TableB的行 。 。 。 ClassZ - > TableZ的行 我使用JDBC获取这些记录并从结果集中创建对象(请注意结果集可能很大)我为每个类都有自定义解析器,即parseClassA(),parseClassB().... parseClassZ(),目前我我有一个函数与一个巨大的switch语句,它确定类的类型如switch(classType)并给我一个对应类的对象,我想消除这个switch语句,这是最好的方法吗?
答案 0 :(得分:2)
这被称为ORM - hibernate是最广泛采用的远程。或者,您可以选择DSL。但是,由于我们是关于这个主题的,我们可能希望在这里有一个功能正常的方法是大纲:
Stream.of(resultSet).flatMap(r -> someHowMakThisAStream(r))
但是,你的查找地图应该是
类型Map<String,Function<Map<String,Object>,T> lookup...
lookup.put("SomeTable", SomeClass::new);
您希望每个类都将列名称映射到值(规范化)而不是结果集,这样每个实例化都不会意外地将结果集转发太远。
然后你可以在psuedo功能中执行:stream.of(results).flatMap().map(valMap -> lookup.get(tableName).apply(valMap))
答案 1 :(得分:1)
您可以使用一个地图结构,将要创建的类与解析器相关联以创建它:
Map<Class<?> clazz, Supplier<Parser>>
您可以使用所有必需的映射初始化地图:
static{
parserByClass = new HashMap<>();
parserByClass.put(MyClass.class, MyParserMyClass::new);
parserByClass.put(MyOtherClass.class, MyOtherParserMyClass::new);
...
}
当您需要创建特定的类时,可以使用map来检索此类的解析器:
Parser<MyClass> parser = parserByClass.get(MyClass.class).get();
您可以调用解析器的parse()
方法:
ResultSet resultSet = ...;
MyClass parse = parser.parse(resultSet);
理想情况下,您应该有Parser
接口来定义parse()
方法并允许定义返回的类型:
public interface Parser<T> {
T parse(ResultSet resultSet);
}
请注意,这是一个未经测试的代码。