【发布时间】:2021-08-05 21:27:20
【问题描述】:
我正在尝试使用配置文件来允许用户选择实现某些抽象类或接口的具体聚类算法。每种算法的先决条件输入可能略有不同。一个小的概念示例:
-
KMedoids只需要用户设置k即可。 -
SpectralClustering还需要k,但还需要其他一些东西,例如Enums 表示图的类型,以及在其内部计算中使用的拉普拉斯算子类型。
两者的共同点都定义在一个抽象类中。
为了让事情更笼统,我做了一个虚拟的例子。假设我有一个 Configuration 类,该类将被传递给某种“引擎”或“驱动程序”,以根据生成的 Configuration 实例完成一项工作。
public class Configuration {
private AbstractAlgorithm algo;
private AbstractParameter param1;
private ConcreteEnum.Enum1 param2;
private ConcreteEnum.Enum2 param3;
// getters and setters...
那我上课了
abstract class AbstractAlgorithm{
AbstractParameter abstractParam;
public void setParam(AbstractParam p) {
this.abstractParam = p;
}
public RandomObject runAlgo(DataObject data);
}
和ConcreteAlgorithm:
public class ConcreteAlgorithm extends AbstractAlgorithm {
ConcreteEnum.enum1 concreteParam1;
ConcreteEnum.enum2 concreteParam2;
public ConcreteAlgorithm(ConcreteParameter p1, ConcreteParameter p2) {
this.concreteParam1 = p1;
this.concreteParam2 = p2;
}
public abstract void runAlgo(DataObject data) {
if (abstractParam == null) {
throw new IllegalStateException();
} else {
// do calculations based on enums and abstractParam value
}
}
那么我的问题是:随附的 .yaml 文件看起来如何,以便可以将其解析为实例化的 Configuration 对象,该对象可以传递给使用它的对象? p>
【问题讨论】:
-
这是一个相当宽泛的问题,对于 SO 来说可能过于宽泛。我想到的一种通用方法是算法的具体类型必须在 yaml 配置中进行编码(例如,通过字段
type),并且每个实现类都有一个它“监听”的type。下一步是获取抽象类的所有具体实现,然后在读取 yaml 时,找到属于该类型的具体实现。 -
@Turing85 您介意将其扩展为答案吗?看起来您确实有一个想法,但我很难将您的评论拼凑成可操作的建议(可能是因为我上周刚刚学习了 YAML 语法)。
-
sigma必须与implementation处于同一缩进级别,因为它似乎是同级节点。implementation不能同时具有标量值GaussianSimilarity和嵌套映射。至于其他错误,请提出一个包含minimal, reproducible example 的新问题。得到一个广泛的答案后,不要将你的广泛问题重塑为具体问题。 -
由于
sigma错误只是一个拼写错误并且与所讨论的问题无关,我认为最好撤消您的编辑。 StackOverflow 有很多关于如何解决mapping values are not allowed here的问题,所以我们可以在这里提出关于反序列化专业化/实现类的问题。
标签: java algorithm config snakeyaml