Java 类型歧义的设计
正在寻找以下场景的重构建议。Java 类型歧义的设计,java,design-patterns,refactoring,Java,Design Patterns,Refactoring,正在寻找以下场景的重构建议。 我们有一个DataMap RecordHolder类的近似结构如下所示。 记录A,记录B。。。。从公共基类型-记录继承 RecordHolder{ RecordA RecordB RecordC RecordD; setRecordA(); setRecordB(); .... } 解析器实用程序读取文件的每一行,并将其转换为相应的记录类型: Map<key,Record> parse(Stri
我们有一个
DataMap
RecordHolder类的近似结构如下所示。
记录A,记录B。。。。从公共基类型-记录继承
RecordHolder{
RecordA
RecordB
RecordC
RecordD;
setRecordA();
setRecordB();
....
}
解析器实用程序读取文件的每一行,并将其转换为相应的记录类型:
Map<key,Record> parse(String line){....}
问题地址:(A) “为地图获取其他内容”和“为地图返回”的最佳习惯用法是什么。
(B) 如果没有明确的记录类型检查(RecordA、RecordB等),如何实现这一点 (A) 对于地图的get-else-put和return,最好的习惯用法是什么 您可以使用
Map#computeIfAbsent()
方法,如下代码所示:
DataMap.computeIfAbsent(key, k -> new RecordHolder()).setRecordXXX(Record);
computeIfAbsent
将键作为第一个参数,将函数作为第二个参数。因此,当密钥不存在值时。然后调用该函数并将其设置为值
映射中可能的实现可以是以下内容(但不是来自jdk的实际实现):
如果您的记录都是从Record类继承的,为什么RecordHolder不能只有一个记录成员而不是每个子类的可能实例?setRecordA(),setRecordB()实际上做什么?它只是将记录分配给RecordA/RecordB成员吗?或者对于每种不同的记录类型是否有特定的逻辑?每个holder对象将包含每种类型的记录-用于解释方法setRecordXXX从legacy中的变体。是否存在无法在RecordHolder中存储列表的原因?然后你可以有一个简单的setRecord(Record)方法。您不需要担心特定的记录类型,并且它在将来仍然是可扩展的。
DataMap.computeIfAbsent(key, k -> new RecordHolder()).setRecordXXX(Record);
public V computeIfAbsent(K key, Function<K,V> mappingFunction){
V value = this.get(key);
if(value == null){
value = mappingFunction.apply(key);
this.put(key, value);
}
return value;
}
public void setRecordXXX(Record record){
if(record instanceof RecordA){
setRecordA((RecordA) record);
} else if(record instanceof RecordB){
setRecordB((RecordB) record);
} else if(...){
// other records
} else {
// throw when unknown record implementation
throw new UnsupportedOperation("RecordType not supported: " + record);
}
}