Pom*_*pot 2 java design-patterns jaxb map
我编写了一个JAXB映射,它将子列表存储在根元素中,LinkedHashMap<String, Object>
而不是Collection<Object>
通过特定的维护XmlJavaTypeAdapter
.下面是一个示例:
@XmlRootElement public class Parent { @XmlJavaTypeAdapter(ListToMapAdapter.class) @XmlElement private LinkedHashMap<String, Child> children; ... }
密钥是根据子标记的属性构建的(例如,<child id="key">
给出Map.Entry<String, Child>
类似的东西){key => child}
.
我的一位同事说它设计不好,而且Map
应该在负责解组XML的对象中.我不同意他的看法.以下是这种方法的一些优点和缺点.您认为哪种设计最好?您认为哪些优点和缺点可以完成辩论?
这个设计的目标:
Map
给予有效使用标准(我的样品中的键),而不是搜索通过迭代上的收集搜索儿童的能力.优点:
Map
在解组时,JAXB会自动构建它:优雅,高效,并保留Map
在umarshalling(迭代)之后使用列表的后期处理构建,@XmlJavaTypeAdapter
存在的话,部分就是为了这个(网上有很多样本).缺点(一些来自我的同事):
Map<String, Child>
在我的示例中声明(在解组时不能由JAXB实例化),@XmlJavaTypeAdapter
目的只是将简单对象转换为特定类型:例如xs:date
Joda时间Calendar
.在此先感谢您的2美分.
我总是建议人们为他们的应用设计最好的模型.然后让JAXB处理将其映射到XML的难度.在这种情况下,如果父母有一个孩子的地图是有意义的,那么通过这种方式一定模仿它.JAXB确实支持Map,但是使用您描述的XML表示法,您将需要使用XmlAdapter.有关更多信息,请参阅
所有优点似乎都合理.没有任何缺点是有效的:
如果要消除包装元素,则可以在MOXy JAXB实现中使用@XmlPath扩展.我的博客文章中的Foo类将略有修改:
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlJavaTypeAdapter(MyMapAdapter.class)
@XmlPath(".")
Map<Integer, String> map = new HashMap<Integer, String>();
public Map<Integer, String> getMap() {
return map;
}
public void setMap(Map<Integer, String> map) {
this.map = map;
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅