在Java枚举

时间:2015-08-19 11:48:49

标签: java enums override grouping xstream

(这个问题不需要了解XStream)

下面是请求XML结构,它使用XStream对Root java bean进行解组 -

<Root>
  <Entity>
     <Action>...</Action>
     <Type>...</Type>
     <Data>...</Data>
  </Entity>
</Root>

由于数据节点是多态的,它可以映射到任一个bean,即 DataABC,DataPQR,DataXYZ 等等:

<Data>
   <A>aaa</A>
   <B>bbb</B>
   <C>ccc</C>
 </Data>
or
 <Data>
   <P>ppp</P>
   <Q>qqq</Q>
   <R>rrr</R>
 </Data>
or
 <Data>
   <X>xxx</X>
   <Y>yyy</Y>
   <Z>zzz</Z>
 </Data>
  

xstream有助于对bean进行umarshaling,如:

     

Root root = xstream.fromXML(rootXML)

有一个 Configurer接口,它通过将一个部分的xml标签映射到实际的pojo bean来帮助配置XStream对象:

interface Configurer<T> {
    public void configure(T t);
}

enum ConfigurersLib implements Configurer<XStream> {
    ROOT("Root", Root.class),
    ENTITY("Entity", Entity.class),
    TYPE("Type", Type.class),
    ACTION("Action", Action.class),
    // polymorphic data tag configurers
    DATA_ABC("Data", DataABC.class),
    DATA_PQR("Data", DataPQR.class),
    DATA_XYZ("Data", DataXYZ.class),
    ;

   @Override
   public void configure(XStream xs){
     xs.alias(this.xmlTag, this.classType);
   }
   //constructor
   private ConfigurersLib(String tag, Class classType){
    this.xmlTag = tag;
    this.classType = classType;
   }
   ...
}

对于给定的请求类型 - 我可以将一些配置程序组合成一个责任链,其中一个链是一个EnumSet:

  

如果Type = ABC则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_ABC}

     

如果Type = PQR则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_PQR}

     

如果Type = XYZ则调用链 - {ROOT,ENTITY,ACTION,TYPE,DATA_XYZ}

上图比较简单但不幸的是这些配置器的数量很大(50-100 +),因此在创建这样的组时可能会丢失一些Configurer枚举元素。这也可能会降低一些清晰度。

问题 什么是最好的方式(模式/技巧/标准)来确保 -

  1. 如何定义完整性(如果我们为给定的传入请求覆盖了所有标签,则配置器设置已完成)

  2. 如何使分组容易被覆盖(对于某些特殊情况,我们可能想要使用PQR而不是ABC。或默认为XYZ等)

0 个答案:

没有答案