开发者社区 问答 正文

设计枚举通用行为

好吧,我今天的问题是:

我有一个带有文件头的枚举。

我有一个将这些标题导出为字符串的函数

运行多个项目,我想使其在我们的私有库中通用。

当前功能:

private static String getHeaders() {
     StringBuilder sb = new StringBuilder();
     for(HeadersEnum header : HeadersEnum.values()){
        sb.append(header.getExportLib());
     }
     return sb.toString();
 }

目标是这样的:

private static String getHeaders(ExportableCSV<Enum<T>> data) {
    StringBuilder sb = new StringBuilder();
    for( ExportableCSV<Enum> header : data.values()){
       sb.append(header.getExportLib());
    }
    return sb.toString();
}

我知道我们无法使用Enum进行继承,所以我创建了一个接口“ ExportableCSV”:

public interface ExportableCSV<T extends Enum<T>> {

public static final String exportLib = "";

public static String getExportLib() {
    return exportLib;
}
}

这是很基本的,但是在我看来,任何实现此ExportableCSV的枚举都应该可以访问我的exportLib()函数。

public enum HeadersEnum implements ExportableCSV<HeadersEnum>{
    foo("foo;"),
    bar("bar;");

private String exportLib; 当然,我对通用函数的目标方法不是编译,并且我不是很了解我能做什么和不能做什么。

展开
收起
几许相思几点泪 2019-12-10 19:48:53 593 分享 版权
阿里云 AI 助理回答

你的目标是使getHeaders方法更加通用,以便它能够处理任何实现了ExportableCSV接口的枚举。你已经定义了一个接口ExportableCSV并尝试让枚举实现它,这是正确的方向。不过,有几个地方需要调整以确保一切按预期工作。

首先,你需要在ExportableCSV接口中定义非静态成员和方法,因为枚举实例将直接使用这些成员和方法。同时,由于枚举的每个实例都需要有其自己的exportLib值,所以这个字段不能是静态的。以下是修改后的接口:

public interface ExportableCSV {
    String getExportLib();
}

然后,在你的枚举中实现这个接口,并为每个枚举值提供相应的exportLib值。注意,这里不再需要定义exportLib字段为静态,而是作为每个枚举实例的属性:

public enum HeadersEnum implements ExportableCSV {
    FOO("foo;"),
    BAR("bar;");

    private final String exportLib;

    HeadersEnum(String exportLib) {
        this.exportLib = exportLib;
    }

    @Override
    public String getExportLib() {
        return exportLib;
    }
}

最后,调整你的getHeaders方法来接受一个泛型集合(而不是直接接受枚举的values(),因为泛型集合可以代表任何实现了ExportableCSV的枚举的值集合)。但是,由于枚举的values()方法是特定于枚举类型的,我们无法直接用泛型表示,因此传入一个包含所有枚举实例的集合更合适:

private static <T extends Enum<T> & ExportableCSV> String getHeaders(Collection<T> data) {
    StringBuilder sb = new StringBuilder();
    for (T header : data) {
        sb.append(header.getExportLib());
    }
    return sb.toString();
}

现在,你可以通过传递枚举的值列表来调用此方法,例如:

Collection<HeadersEnum> headersCollection = Arrays.asList(HeadersEnum.values());
String headers = getHeaders(headersCollection);

这样,你的getHeaders方法就变得非常通用,可以处理任何实现了ExportableCSV接口的枚举类型了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: