我想将Metrics用作mixin。
所以,我想定义像这样的多个类(伪代码):
class MyClass1 extends MyParent with MyMetricsHelper(myJMXMBeanServer)
class MyClass2 extends MyParent with MyMetricsHelper(myJMXMBeanServer) // repeat parameter bad
class MyClass3 extends MyParent with MyMetricsHelper(myJMXMBeanServer) // repeat parameter bad
如您所见,当我致电MyMetricsHelper
时,我会传递myJMXMBeanServer
的参数,以便知道如何登录。
但是,我不想在每个混合它的类中重复myJMXMBeanServer
,因为复制它并不好。
另外,我不希望有一个不同的单点来初始化MyMetricsHelper
,因为它对我来说看起来不漂亮,因为我只是想把它混合起来并让它起作用,我不这样做想要记住我在代码中有另一个要点,我必须初始化它。
实现这一目标的任何优雅方式?
答案 0 :(得分:4)
特征are not allowed to have constructor parameters。
相反,您可以为您定义一个为myJMXBeanServer
指定的子特征(我不太清楚为什么您认为在一个地方进行初始化很糟糕 - 无论是那个还是在几个地方进行初始化,这就是你现在拥有的):
class MyParent
trait MyMetricsHelper {
val server: AnyRef // Replace by actual type, this means
// that we expect any impl. to initialize this field somehow
}
trait MyJMXMetricsHelper extends MyMetricsHelper {
val server = "myJMXMBeanServer"
}
class MyClass1 extends MyParent with MyJMXMetricsHelper
class MyClass2 extends MyParent with MyJMXMetricsHelper
class MyClass3 extends MyParent with MyJMXMetricsHelper