scala mixin和单初始化

时间:2013-12-15 17:38:24

标签: scala inheritance mixins traits

我想将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,因为它对我来说看起来不漂亮,因为我只是想把它混合起来并让它起作用,我不这样做想要记住我在代码中有另一个要点,我必须初始化它。

实现这一目标的任何优雅方式?

1 个答案:

答案 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