【问题标题】:How to abstract types of transformations如何抽象转换类型
【发布时间】:2019-12-28 01:07:20
【问题描述】:

我有一个程序已经通过 JAXB 将 POJO 转换为 xml,这是通过将元素添加到此表单中的列表来完成的

List<JAXBElement<?>> elementsToTransform = new ArrayList<JAXBElement<?>>();

在其他方法中我只是将elementsToTransform转换并填充为xml,这种方法的公司是这样的

private List<JAXBElement<?>> transform(Student student) 

现在我需要添加一种通过 Gson 转换为 Json 的方法,并且我想抽象声明和方法以支持这两种格式,但是实现非常硬编码为 xml,我需要按照它的方式来适应这个解决方案是用 xml 构建的,因为这取决于我不想修改的其他功能,所以我会知道是否有一种方法可以支持这两种格式,这将是解决这个问题的更好选择

最后我想在 elementsToTransform 列表中有这样的东西

JAXBElement(0)
JAXBElement(1)
JAXBElement(2)
String(3)(this will be Json)

【问题讨论】:

  • 所以 elementsToTransform 可以同时包含 JAXBElement>String 吗?或者对于 XML,它应该像 List> 而对于 Json List ?
  • 我希望 elemenToTransform 可以同时包含 jaxbelements 和 json 字符串,但该方法当前返回 jaxbelements 列表,因为它是转换消息的主要机制(学生,成绩这就是原因我有 JAXBElements >) ,那部分是抽象的,每个转换器的实现是相互分离的,最后会发生 elementsToTransform 的迭代,每个元素都将被发布到队列中,我需要相同的列表包含两种格式
  • 那部分是抽象的,你的意思是学生和年级有通用接口或超类?或者您是否有单独的方法,例如 private List> transform(Student student) , private List> transform(Grade Grade)跨度>
  • 我的意思是 Student 和 Grade 不相关,但两者都使用此功能来转换为 xml,但两者的实现都是分开的
  • 您可以使用 List> elementsToTransform 并且在迭代时您可以检查 instanceof JAXBElement> 或 String ,然后将其转换为 JAXBElement>String

标签: java design-patterns


【解决方案1】:

实现一个包装类以合并 String 或 JAXBElement。这可以通过枚举类型来识别。每种类型的转换都可以实现为接口方法。

interface IConvert{
 JSONObject convert(WrappedObject o){
}

类型枚举可以定义如下

enum Type implements IConvert{
 STRING {
  public JSONObject convert(WrappedObject o){
    String str = o.getString();
    //use Gson here and convert;
    return json;
  } 
 },
  JAXB {
  public JSONObject convert(WrappedObject o){
    JAXBElement jax = o.getJAX();
    //use Gson here and convert;
    return json;
  } 
 };
}

最后 WrappedObject 看起来像这样:

class WrappedObject {
 private String str;
 private JAXBElement jax;
 private Type type;

 public WrappedObject(String str){
  this.str=str
  this.type=Type.STRING;
 }

 public WrappedObject(JAXBElement jax){
  this.jax=jax
  this.type=TYPE.JAXB;
 } 

 public TYPE getType(){
  return this.type;
 }

 public JSONObject convert(){
  return type.convert(this);
 } 

 //..other getters and setters
}

希望这能回答您的设计模式问题。

【讨论】:

  • interface IConvert{ JSONObject convert(WrappedObject o){ } 应该返回泛型还是类型(枚举)?
  • 根据@jam 的要求,转换从elementsToTransform 列表中返回一个JSONObject。我相信您也可以稍微修改代码以在此处返回泛型。但它也是一个抽象类或接口是有道理的。
猜你喜欢
  • 2022-05-24
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多