tl;博士:
我正在寻找枚举特定对象的变量的最佳模式,以及这些变量可能采用的范围。然后我想根据特定的变量设置配置对象。
长版:
我正在浏览一些旧代码,试图清理我过去制作的一些丑陋的黑客行为。我有一个不错的机器学习和数据挖掘库。在这个库中有各种统计模型(和其他组件),可以通过给定足够数据(称为训练)的数学优化来学习它们自己的许多参数。但是,还有其他参数(超参数)在训练之前设置为输入之一。可以通过选择许多有效设置、为每个设置构建模型并选择获胜者来“调整”超参数。可以在此过程中使用递归来调整几个超参数。
问题:
在我看来,优雅地处理超参数(更一般地,选项)的有效系统所需的组件是:
- 一个静态变量,枚举所有不同类型的所有不同选项(枚举、浮点数、布尔值等)、有效值范围等。这些还可以存储每个选项的默认值。
- 一个构造函数,它接受配置并使用此选项设置构建对象。
- 很高兴拥有:例如,能够从 .properties、gnu cli 或 yaml 进行“配置”。
我遇到的困难:
这里的主要困难之一似乎是1)。Java 没有任何真正的机制来支持静态抽象变量,以防止强制实现“可配置”接口的给定类存储它们自己的默认配置实现。有没有解决这个问题的好方法?
父类的默认配置应传递给子类。
我可以创建一个采用配置对象的构造函数,但是将其扩展为也采用此配置的(cli、yaml、.properties)表现形式有点棘手。
我很想有任何关于解决 stackoverflow 可以提供的问题的建议。我一直在考虑这个问题,目前我所拥有的只是丑陋的黑客,而不是漂亮的代码。