java - 不同的返回类型

标签 java oop encapsulation

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

我注意到读取文件所需的代码实际上是相同的,但每行“处理”代码不同。因此,就像所有 OOP 的优秀学生一样,我想提取重复的代码并将其封装在一个抽象类中。这是抽象类的接口(interface):

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 教育付诸实践。

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

最佳答案

泛型是执行此操作的正确方法。让抽象类使用泛型,并且每个子类都定义泛型。

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>{ .. }

旁白:你的抽象类无法编译。未指定返回类型。

关于java - 不同的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19595495/

相关文章:

python - Celery 动态任务/将 Celery 实现隐藏在接口(interface)后面

java - JCheckBox 未出现

c++ - 接口(interface)和公共(public)方法

java - 面向对象编程,将参数传递给方法比在构造函数中更面向对象吗?

java - 实现java对象之间通信的正确方法是什么?

python - 如何避免不小心弄乱Python中的基类?

java - 使用 for 循环访问 4d 数组时出现 NullpointerException

java - 无法调用 ViewDebug.ExportedProperty 方法

java - 抽屉菜单未显示在 ViewPager + ActionBar.Listener 中

java - 封装的指标是什么?