好吧,我今天的问题是:
我有一个带有文件头的枚举。
我有一个将这些标题导出为字符串的函数
运行多个项目,我想使其在我们的私有库中通用。
当前功能:
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; 当然,我对通用函数的目标方法不是编译,并且我不是很了解我能做什么和不能做什么。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你的目标是使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
接口的枚举类型了。