java - 将实体映射到正确的子类
问题描述
我有以下类 Entity、BaseClass、SubClass1、SubClass2。
public class Entity {
private String field1;
private String field2;
private String type;
private String field3;
private String field4;
}
public class BaseClass {
private String field1;
private String field2;
private String type;
}
public class SubClass1 extends Base {
private String field3;
}
public class SubClass2 extends Base {
private String field4;
}
实体是通过调用 API 获得的。根据type
BaseClass 的属性值,我想将 Entity 映射到相应的子类。
我能想到映射的一个选项如下,
@Mapper
public interface EntityMapper {
SubClass1 mapEntityToSubClass1(Entity entity);
SubClass2 mapEntityToSubClass2(Entity entity);
}
我将根据我的业务逻辑调用其中一个方法mapEntityToSubClass1
或有条件地调用。由于我将从外部 API 获取列表,因此循环检查输入的类型对我来说似乎并不好。在我的业务逻辑中,目前有 4 个子类,将来可能会有更多,而且逻辑变得更加笨拙。mapEntityToSubClass2
type
Entity
有没有更好的方法在 mapstruct 中实现相同的功能?
解决方案
不确定我是否理解正确,但您只想根据源中的字段选择要映射到哪个子类?不要在业务逻辑中这样做,只需使用默认方法即可。像这样的东西:
@Mapper
public interface EntityMapper {
default BaseClass map(Entity entity) {
if(entity.getType().equals("a"))
return mapEntityToSubClass1(entity);
if(entity.getType().equals("b"))
return mapEntityToSubClass2(entity);
throw new RuntimeException("Unsupported base type");
}
Sub1 mapEntityToSubClass1(Entity entity);
Sub2 mapEntityToSubClass2(Entity entity);
}
推荐阅读
- java - List 的未经检查的转换警告
- python - Python Pandas 中的排列和组合
- typescript - 从未在类型接口中声明的对象中删除属性
- java - Java making switch case statment shorter
- python - passing a parameter to a form in FormView Django
- c# - 在文件夹视图中,Visual Studio 2017 中的项目属性在哪里?
- azure-application-insights - Azure Application Insights 中的用户代理信息
- c++ - 执行顺序问题
- regex - 在 bash 脚本中的 case 语句中捕获模式组
- c# - 将弹出分数放置在敌方位置