我有一个程序,它从几个输入文件中读取数据,每个文件都是逐行处理的。读取文件每一行的代码是相同的,但提取数据的格式和要求因文件而异。更具体地说,我有一个存储键/值对的配置文件和一个记录文件——每行存储一条记录。
我注意到读取文件所需的代码几乎相同,但每行“处理”代码不同。因此,像任何 OOP 的好学生一样,我想提取重复的代码并将其封装在一个抽象类中。这是抽象类的接口:
abstract class FileProcessor {
public processFile() {};
protected abstract processLine(aLine); // implemented by the subclass
public abstract getData();
}
因此,processFile 包含“样板”文件处理代码。processFile 方法调用抽象的processLine 方法,该方法在子类中实现,并允许子类特定的文件处理操作。现在我有以下子类。
public ConfigFileProcessor extends FileProcessor {
processLine(String line) {
// do some file-specific processing
}
}
public RecordFileProcessor extends FileProcessor {
processLine(String line) {
// do some file-specific processing
}
}
问题是getData
方法。正如我之前所说,每个文件中的数据都不同——在这种情况下,一个包含键/值对,另一个包含记录。如何以一般(非特定于实现)方式定义 getData 的返回类型?我正在考虑返回一个 Collection 并使用通配符来指定类型,但我对泛型的经验不足,无法理解这种选择的含义/权衡。
设计可以改进吗?在这种情况下,是否值得通过封装的麻烦?我想我可以创建两个返回不同数据类型的不同 processFile 方法,但如果可能的话,我想将我的 OOP 教育付诸实践。
预先感谢您的时间和精力。