Scala:案例类的静态val或def

时间:2017-10-11 13:20:34

标签: scala

我知道我可以将一个伴侣对象添加到静态def / val的类中,但我的问题是我希望它能够确定一个特性。我想要访问这个静态val或def作为抽象类型(根据java static预期的行为使用static here) 考虑一下这段代码

wget "http://bitbucket.org/eigen/eigen/get/3.2.8.tar.gz"

tar zxvf 3.2.8.tar.gz

cd eigen*

/eigen-eigen-07105f7124f9$ mkdir build

/eigen-eigen-07105f7124f9$ cd build

/eigen-eigen-07105f7124f9/build$ cmake .. 

/eigen-eigen-07105f7124f9/build$ make

/eigen-eigen-07105f7124f9/build$ sudo make install

我希望能够在没有M实例的情况下将M.description作为静态方法调用。我的用例是我有一个M对象的spark数据集,我希望看到M的描述属性而不获取记录从数据集中,因为这将导致火花动作/作业 我可以使用scala模式吗?谢谢

2 个答案:

答案 0 :(得分:2)

只需为M创建一个伴随对象,它定义静态值,然后在案例类中引用它

object M {
  val description = "I'm M"
}
case class M extends A with B {
  override def description = M.description
}

或假设子类型之间存在共性

trait Description {
  val title: String
  val description = s"I'm ${title}"
}
object M extends Description {
  val title = "M"
}
object N extends Description {
  val title = "N"
}
case class M() extends A with B {
  override def description = M.description
}
case class N() extends A with B {
  override def description = N.description
}

答案 1 :(得分:0)

您可以将B的描述重构为另一个特征,如:

trait BInfo {
  def description: String
}
trait B extends BInfo {
  def bBehavior(): Unit
  def bInfo: BInfo
  final override def description = bInfo.description
}
case class M() extends A with B {
  override def aBehavior() = print("A behavior of M")
  override def bBehavior() = print("B behavior of M")
  override def bInfo = M
}
object M extends BInfo {
  override def description = "I'm M"
}

val m = M()
M.description // I'm M
m.description // I'm M