根据类型创建java对象

时间:2017-07-03 12:18:08

标签: java design-patterns

我有一组数据对象,它们对应于RDMS表中的行,如ClassA中的那样 - > TableA的行 ClassB - > TableB的行 。 。 。 ClassZ - > TableZ的行 我使用JDBC获取这些记录并从结果集中创建对象(请注意结果集可能很大)我为每个类都有自定义解析器,即parseClassA(),parseClassB().... parseClassZ(),目前我我有一个函数与一个巨大的switch语句,它确定类的类型如switch(classType)并给我一个对应类的对象,我想消除这个switch语句,这是最好的方法吗?

2 个答案:

答案 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);    
 }

请注意,这是一个未经测试的代码。