我在 Scala 中使用了一个外部库,它使用一组特征将复杂的配置选项传递给不同的方法。这是 Highcharts Scala API,但问题似乎更普遍。
该库定义了一个trait(实际使用中的HighchartsOptions),它只是一个数据传输对象,它存储了一些字段并允许它们被传递。为了清楚起见,代码简化和概括如下所示:
trait Opts {
def option1: Int = 3
def option2: String = "abc"
//Many more follow, often of more complex types
}
只要可以在一个地方生成完整的选项集,就可以使用简洁的语法:
val opts = new Opts() {
override val option1 = 5
//And so on for more fields
}
doSomething(opts)
但是,在某些情况下,一段代码准备了这样的配置,而另一段代码只需要额外调整一个选项。能够将一些Opts
实例传递给一个方法并让该方法修改一个或两个值会很好。
由于原始特征基于def
s 而不是var
s,因此只有在对象类型已知的情况下才可以轻松覆盖选项的值,就像上面的示例一样。如果一个方法只接收 的某个匿名子类的实例,Opts
它如何创建另一个实例或修改接收到的实例,以便调用 egoption2
可以返回不同的值?所需的操作类似于Mockito 的spy
操作,但是我觉得应该有一些比使用模拟框架来实现此效果的方式更不做作。
PS:实际上我对图书馆的作者使用这样的界面感到有点惊讶,所以也许我遗漏了一些东西,并且有一些完全不同的方法可以实现我的目标,即从几个不同的地方构建一组选项代码(例如,一些可变的构建器对象,我可以传递而不是完成HighchartsOptions
)?