gpt4 book ai didi

java - 从字符串标识符进行多态构造

转载 作者:行者123 更新时间:2023-12-01 09:44:45 24 4
gpt4 key购买 nike

我正在尝试为我的程序设置一个多态 ExportRule 系统,但我无法弄清楚如何从配置文件构造所需的 ExportRule,该配置文件通过字符串在文件顶部定义了 ExportRule。

我想做这样的事情:

private ExportRule loadExportRule(String fileName) throws IOException, InvalidConfigurationException, FileNotFoundException{
if(fileName == null) {
throw new NullPointerException("fileName cannot be null!");
}
YamlConfiguration exportRuleConfig = new YamlConfiguration();
exportRuleConfig.load(getFilePath(fileName));

return ExportRules.fromString(exportRuleConfig.getString("exportRule")).fromYamlConfiguration(exportRuleConfig);
}

其中 ExportRules 是一个将 String 映射到实际 .class(扩展 ExportRule)的枚举,然后调用静态 fromFileConfiguration() 工厂方法从文件生成 ExportRule,如下所示:

exportRule: nameOfExportRule
//all the configurationstuff for the rule

我遇到的问题是如何实际调用 fromFileConfiguration() 方法,因为它是一个静态方法,因此 java 不允许我通过 ExportRule 接口(interface)保证它的存在

有没有一种干净的方法来实现这样的事情,或者我是否必须在枚举中为每个 ExportRule 执行某种 switch 语句?

编辑:

谢谢你glee8e!

这是我的枚举:

public enum ExportRules {
COMMENT_CONCAT("CommentConcat") {
@Override
public ExportRule fromFileConfiguration(FileConfiguration fileConfiguration) throws InvalidConfigurationException {
return CommentConcat.fromFileConfiguration(fileConfiguration);
}
};

private String name;

ExportRules(String name) {
this.name = name;
}

public abstract ExportRule fromFileConfiguration(FileConfiguration fileConfiguration) throws InvalidConfigurationException;

public String getName() {
return name;
}

public static ExportRules fromString(String str) {
for(ExportRules rule : ExportRules.values()) {
if(str.equalsIgnoreCase(rule.getName())) return rule;
}
return null;
}

}

最佳答案

多态性不适用于静态内容,而是实例方法,至少在 Java 中是这样。让您的 fromFileConfiguration 成为一个抽象实例方法,并在各个常量中实现它:

public enum ExportRules {
A_RULE {
@Override public ExportRule fromFileConfiguration(YamlConfiguration c) {...}
},
//...
public abstract ExportRule fromFileConfiguration(YamlConfiguration c);

}

记住java枚举也是普通的类。它们可以实现接口(interface)、具有抽象方法等等。不过,您不能将其作为非 Enum 父类(super class)和非私有(private)构造函数。

P.S.:对于 Java8,由于该枚举只有一个抽象方法,因此您可以使用 Function 而不必创建许多子类,如下所示:

public enum ExportRules {
A_RULE((c) -> {//...}),
//...
private final Function<YamlConfiguration, ExportRule> func;
private ExportRules( Function<YamlConfiguration, ExportRule> fun) {
func = fun;
}

public ExportRule fromFileConfiguration(YamlConfiguration c) {
return func.apply(c);
}

}

这不是经典的多态性,但它可以完成工作并减少生成的废料。

关于java - 从字符串标识符进行多态构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com