将实体映射到正确的子类

时间:2020-07-03 13:37:56

标签: java mapstruct

我有以下类Entity,BaseClass,SubClass1,SubClass2。

[13, 20, 16, 12, 11, 50]
your numbers: 13 20 16 12 11 50
you won [13, 20, 16, 12, 11, 50]
user_numbers = [int(number) for number in userinput.split()]
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;
}

实体是通过调用API获得的。根据BaseClass的public class SubClass1 extends Base { private String field3; } 属性的值,我想将Entity映射到相应的子类。

下面是我可以想到的一种映射方式,

public class SubClass2 extends Base {
  private String field4;
}

我将根据我的业务逻辑中的type有条件地调用方法@Mapper public interface EntityMapper { SubClass1 mapEntityToSubClass1(Entity entity); SubClass2 mapEntityToSubClass2(Entity entity); } mapEntityToSubClass1。由于我将从外部API获取列表,因此循环遍历,检查mapEntityToSubClass2中的类型对我来说似乎并不好。在我的业务逻辑中,当前有4个子类,将来会有更多子类,并且逻辑变得更加笨拙。

在mapstruct中是否有更好的方法来实现相同的功能?

1 个答案:

答案 0 :(得分:1)

不确定我是否理解正确,但是您只想根据源中的字段选择要映射到的子类?不要在业务逻辑中这样做,只需使用默认方法即可。像这样:

@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);
}