【问题标题】:Using interface with enums使用枚举接口
【发布时间】:2014-02-14 19:15:55
【问题描述】:

我正在编写一个关于医疗信息的小型项目,在其中,我正在读取来自多个数据源的文本。所有这些文本源都具有相同的类型信息,但标签略有不同。例如,sourceA 有一个标题为“不利影响”的部分,而 sourceB 将其称为“副作用”。

我有一个名为Reader 的接口,以及几个实现该接口的类(AReaderBReader 等)。此外,我为每个班级的章节标题提供了枚举。例如:

enum ASections {
    SIDE_EFFECTS ("side effects"),
    DOSAGE       ("dosage");
    private String sectionTitle;
    private ASections(String s) { this.sectionTitle = s; }
}

enum BSections {
    SIDE_EFFECTS ("adverse effects"),
    DOSAGE       ("dosage and usage");
    private String sectionTitle;
    private BSections(String s) { this.sectionTitle = s; }
}

我的项目的核心是一个Orchestrator 类,它使用Reader(实际的源A、B 等由命令行选项指定)。到目前为止一切顺利。

但是,我希望所有实现 Reader 的类也实现方法 getSectionText,其中参数应该是 ASections 或 BSections 或 ...

如何在接口级别指定这样的方法?

这是我的第一次(显然是错误的)尝试:

public String getSectionText(Enum _section_enum);

这个想法是,无论在命令行指定哪个数据源,我都应该能够通过获取适当的节标题来获得所需的类型文本。

【问题讨论】:

  • 最简单的事情可能是让你的 enums 实现一个接口,使用一个方法 getSectionText 接受任何必要的参数。
  • 我不明白返回 sectionText 的内容,你为什么要传递一个枚举?
  • @nachokk :在我的设计中,实现Reader 接口的类有一个映射,它将节标题映射到节正文中的实际文本。我想从标题的确切文本中抽象出来(因为它们可能在多个来源中有所不同,例如“剂量”、“剂量和用法”等)。因此,此映射将枚举(例如 ASections.DOSAGE)作为键,将文本作为值。然后我可以通过Reader#getSectionText 获取文本。
  • @LouisWasserman:我什至不知道枚举可以实现接口!现在正在调查。

标签: java interface enums


【解决方案1】:

创建一个定义枚举必须实现的方法的接口:

interface Sections {
    String getSectionTitle();
}

在您的枚举中,实现该接口:

enum ASections implements Sections {
    SIDE_EFFECTS ("side effects"),
    DOSAGE       ("dosage");
    private String sectionTitle;
    private ASections(String s) { this.sectionTitle = s; }
    public String getSectionTitle() { return sectionTitle; }
}

enum BSections implements Sections {
    SIDE_EFFECTS ("adverse effects"),
    DOSAGE       ("dosage and usage");
    private String sectionTitle;
    private BSections(String s) { this.sectionTitle = s; }
    public String getSectionTitle() { return sectionTitle; }
}

在您的阅读器中,getSectionText 方法采用 Sections 参数而不是任何特定的枚举(针对接口的代码,而不是针对实现的代码):

class Reader {
    public String getSectionText(Sections sections) {
        return sections.getSectionTitle();
    }
}

然后您可以将ASectionsBSections 传递给阅读器:

public class Section8 {
    public static void main(String[] args) {
        Reader reader = new Reader();
        for (ASections asection : ASections.values()) {
            System.out.println(reader.getSectionText(asection));
        }
        for (BSections bsection : BSections.values()) {
            System.out.println(reader.getSectionText(bsection));
        }
    }
}

输出:

副作用
剂量
不利影响
用量与用法

顺便说一句,问题中定义的枚举中存在错误。构造函数是公共的,但在 Java 中,枚举的构造函数必须是私有的。

【讨论】:

  • 另一个但密切相关的问题:我在每个枚举 ASections、BSections 等中都有一个静态方法。它们做的事情完全相同,但我不能在一个界面。有没有办法在所有枚举 ASection、BSection 等中推广这种方法?
  • 你能简单地把它变成一个实例方法吗?为什么它必须是静态的?如果这不起作用,我建议将其作为一个单独的问题提出。
  • 完成。在这里放一个链接,以防有人感兴趣:stackoverflow.com/questions/21789191/…
【解决方案2】:

只需让枚举实现一个接口 MySection,它指定getSectionText 的一种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多