【发布时间】:2016-12-28 01:34:33
【问题描述】:
我在 stackoverflow.com 上重新检查了一些关于树结构的文档和一些关于该主题的相关答案,例如this one,它们大多使用原始类型或仅使用一种不适用于我的问题的特定类型。我有一个将元数据存储为 XML 的文件,因此解析不是问题,但我仍然需要一个干净的数据结构来存储实际信息。
文件的实际部分
<File>
<Meta>
<Generator>default</Generator>
<HeaderHash>110EbosCOut9ooqtIza4yHdT9xx+wUAp1VMfPqpQKwM=</HeaderHash>
<Color/>
<MemoryProtection>
<ProtectTitle>False</ProtectTitle>
<ProtectUserName>False</ProtectUserName>
<ProtectPassword>True</ProtectPassword>
<ProtectURL>False</ProtectURL>
<ProtectNotes>False</ProtectNotes>
</MemoryProtection>
<CustomIcons/>
<Binaries />
<CustomData/>
</Meta>
</<File>
我想出的数据结构
public class MetadataEntry {
public MetadataEntry() {
this.entity = new Entry();
}
private class Entry<T> {
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<MetadataEntry>) this.value).add((MetadataEntry) value);
} else {
this.value = (T) new ArrayList<MetadataEntry>();
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<MetadataEntity> getChildNodes() {
if (isGroup()) {
return (List<MetadataEntry>) this.entity.value;
}
return null;
}
public String getValue() {
if (!isGroup()) {
return (String) this.entity.value;
}
return null;
}
}
那么,如果显然没有必要,您能否建议如何使其更清洁,而不使用原始类型,并避免使用instanceof?或者更好地指出我在哪里可以阅读更多相关信息。
如果由于某种原因对主题不感兴趣,那么争论的 cmets 将受到更多的赞赏,而不是投反对票。
【问题讨论】:
-
是的,你应该避免使用
instaceof,直到你能证明它是最好的选择。在这种情况下,它不是,但它看起来是设计问题的副作用。您能否澄清您提到的树并解释为什么您将列表作为潜在价值?