2013-10-25 141 views
0

我有一个程序从几个输入文件中读取数据,每个文件一行一行地处理。读取文件每一行的代码是相同的,但提取数据的格式和要求因文件而异。更具体地说,我有一个配置文件,它存储键/值对和一个记录文件 - 每行存储一条记录。不同的返回类型

我注意到读取文件所需的代码实际上是相同的,但每行“处理”代码是不同的。所以,像任何优秀的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的返回类型?我正在考虑返回一个集合并使用通配符来指定类型,但我没有足够的经验来理解这种选择的含义/折衷。

设计是否可以改进?在这种情况下甚至值得通过封装的麻烦?我想我可以创建两个不同的processFile方法来返回不同的数据类型,但是如果可能的话,我想让我的OOP教育练习。

预先感谢您的时间和精力。

+1

你可以使用泛型,我认为这是最好的方法。 –

+1

返回类型以及您可以创建自定义类。实施其父母。像FileResult-> ConfigFileResult ... – Ankit

回答

3

泛型是正确的做法。让抽象类使用泛型,每个子类定义泛型。

abstract class FileProcessor<T> { 
    public void processFile() {}; 
    protected abstract T processLine(aLine); // implemented by the subclass 
    public abstract T getData(); 
} 

public ConfigFileProcessor extends FileProcessor<Configuration>{ ... } 
public RecordFileProcessor extends FileProcessor<Record>{ .. } 

另外:你的抽象类不能编译。没有指定返回类型。