避免使用检查实例相关和原始类型

我在stackoverflow.com上重新检查了一些关于树结构的文档以及关于这个主题的一些相关答案,例如这个 ,它们主要使用原始类型或只是一种不适用于我的问题的特定类型。 我有一个文件存储元作为XML,所以解析不是一个问题,但我仍然需要一个干净的数据结构来存储实际的信息。

文件的实际部分

  default 110EbosCOut9ooqtIza4yHdT9xx+wUAp1VMfPqpQKwM=   False False True False False      </ 

我提出了数据结构

 public class MetadataEntry { public MetadataEntry() { this.entity = new Entry(); } private class Entry { private String name; private T value; private boolean isGroup; private void setValue(T value) { if (value instanceof String) { this.value = value; this.isGroup = false; } if (value instanceof MetadataEntry) { if (isGroup()) { ((List) this.value).add((MetadataEntry) value); } else { this.value = (T) new ArrayList(); this.isGroup = true; setValue(value); } } } } private Entry entity; public void setName(String name) { this.entity.name = name; } public String getName() { return this.entity.name; } public void setValue(String value) { entity.setValue(value); } public void setValue(MetadataEntry value) { entity.setValue(value); } public boolean isGroup() { return this.entity.isGroup; } public List getChildNodes() { if (isGroup()) { return (List) this.entity.value; } return null; } public String getValue() { if (!isGroup()) { return (String) this.entity.value; } return null; } } 

那么,如果显然不需要使用原始类型并且避免使用instanceof ,您能否建议如何使其更清洁? 或者更好地指出我,请在哪里阅读更多相关信息。

如果由于某种原因该主题不感兴趣,则会更加赞赏议论意见,而非进行投票。

Composite Pattern将适合您的情况,引用“设计模式” GoF

将对象组合成树结构以表示部分整体层次结构。 Composite允许客户端统一处理单个对象和对象组合。

以下代码使用应用的Composite Pattern合成树结构。

 /** * declares the interface for objects in the composition * @param  */ interface MetaEntry extends Iterable> { T getName(); MetaEntry setName(T name); T getValue(); MetaEntry setValue(T name); MetaEntry add(MetaEntry entry); MetaEntry remove(MetaEntry entry); } /** * represents leaf objects in the composition. A leaf has no children. * @param  */ class SimpleMetaEntry implements MetaEntry { T name; T value; @Override public T getName() { return name; } @Override public MetaEntry setName(T name) { this.name = name; return this; } @Override public T getValue() { return value; } @Override public MetaEntry setValue(T value) { this.value = value; return this; } @Override public MetaEntry add(MetaEntry entry) { throw new UnsupportedOperationException(); } @Override public MetaEntry remove(MetaEntry entry) { throw new UnsupportedOperationException(); } @Override public Iterator> iterator() { // we want to treat all objects uniformly. return new Iterator>() { @Override public boolean hasNext() { return false; } @Override public MetaEntry next() { return null; } }; } @Override public String toString() { return "<" + name + (value == null ? "/>" : ">" + value + "\n"); } } /** * defines behavior for components having children. * @param  */ class CompositeMetaEntry implements MetaEntry { T name; T value; List> list = new ArrayList>(); @Override public T getName() { return name; } @Override public MetaEntry setName(T name) { this.name = name; return this; } @Override public T getValue() { return value; } @Override public MetaEntry setValue(T value) { this.value = value; return this; } @Override public MetaEntry add(MetaEntry entry) { list.add(entry); return this; } @Override public MetaEntry remove(MetaEntry entry) { list.remove(entry); return this; } @Override public Iterator> iterator() { return list.iterator(); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("<" + name + ">"); for(MetaEntry metaEntry : this) { builder.append(metaEntry.toString()); } builder.append(""); return builder.toString(); } } public static void main(String[] args) throws Exception { MetaEntry compositeMetaEntry = new CompositeMetaEntry(); compositeMetaEntry.setName("File"); compositeMetaEntry.add( new CompositeMetaEntry().setName("Meta").add( new SimpleMetaEntry().setName("Generator").setValue("default") ).add( new SimpleMetaEntry().setName("HeaderHash").setValue("110EbosCOut9ooqtIza4yHdT9xx+wUAp1VMfPqpQKwM=") ).add( new SimpleMetaEntry().setName("Color") ).add( new CompositeMetaEntry().setName("MemoryProtection").add( new SimpleMetaEntry().setName("ProtectTitle").setValue("False") ).add( new SimpleMetaEntry().setName("ProtectUserName").setValue("False") ).add( new SimpleMetaEntry().setName("ProtectPassword").setValue("True") ).add( new SimpleMetaEntry().setName("ProtectURL").setValue("False") ).add( new SimpleMetaEntry().setName("ProtectNotes").setValue("false") ) ).add( new SimpleMetaEntry().setName("CustomIcons") ).add( new SimpleMetaEntry().setName("Binaries") ).add( new SimpleMetaEntry().setName("CustomData") ) ); System.out.println(compositeMetaEntry); }