我有一个解析器类,它解析文档并在Map中返回解析的数据。
以下是我的课程外观。
public interface DocumentParser {
public Map<String, String> parse(Document document);
}
public class ExcelParser implements DocumentParser{
@Override
public Map<String, String> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, String>();
}
}
public interface Document {
public InputStream getInputStream();
}
public class ExcelDocument implements Document{
@Override
public InputStream getInputStream() {
// TODO Auto-generated method stub
return null;
}
}
public interface DocumentValidator {
public void validate(Map<String, String> documentData, Map<String, String> referenceData, List<String> referenceKeyList);
}
public class ExcelValidator implements DocumentValidator{
@Override
public void validate(Map<String, String> documentData,
Map<String, String> referenceData, List<String> referenceKeyList) {
// TODO Auto-generated method stub
}
}
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Document document = new ExcelDocument();
DocumentParser parser = new ExcelParser();
Map<String, String> parsedData = parser.parse(document);
DocumentValidator documentValidator = new ExcelValidator();
documentValidator.validate(parsedData, new HashMap()<String, String>, new ArrayList()<String>);
}
}
现在可能有不同类型的解析器,如CSVParser或PDFParser等。
但我不确定Map将包含哪种类型的对象。我不想限制类的用户只返回Map。
用户也可以返回一些自定义对象。我想让用户自由地返回任何类型的对象。
如果我执行Map,则必须在从parse方法中捕获返回值时进行显式转换。
有人可以建议可以采取哪些措施来实现更好的设计吗?
答案 0 :(得分:5)
如果我理解你在问什么,为什么不简单地让你的界面通用?
public interface DocumentParser<K,V> {
Map<K,V> parse(Document document);
}
public class ExcelParser implements DocumentParser<String, String> {
@Override
public Map<String, String> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, String>();
}
}
public SomeOtherParser implements DocumentParser<String, Integer> {
@Override
public Map<String, Integer> parse(Document document) {
// TODO Auto-generated method stub
return new HashMap<String, Integer>();
}
}
编辑以添加评论:您的类已经通过声明它实现接口并填写类型来明确说明K
和V
是什么。因此,实例化您的类只是:
ExcelParser ep = new ExcelParser();
Map<String, String> map = ep.parse(someDocument);
SomeOtherParser sop = new SomeOtherParser();
Map<String, Integer> otherMap = sop.parse(someOtherDoc);
您对DocumentValidator
界面执行相同的操作:
public interface DocumentValidator<K,V> {
void validate(Map<K, V> documentData, Map<K, V> referenceData,
List<K> referenceKeyList);
}
(我猜测最后一个List
参数包含与地图键相同的类型)
评论的最后一次编辑:您可以在界面声明中拥有任意数量的类型;如果您真的需要它,<K, V, K2, V2>
是完全合法的:
public interface DocumentValidator<K, V, K2, V2> {
void validate(Map<K, V> documentData, Map<K2, V2> referenceData,
List<K2> referenceKeyList);
}
public class ExcelValidator implements DocumentValidator<String,String,String,Integer>{
@Override
public void validate(Map<String, String> documentData,
Map<String, Integer> referenceData,
List<String> referenceKeyList) {
// TODO Auto-generated method stub
}
}