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);
    }
}