- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的程序设置一个多态 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!