如何为每个子类创建一个数据的副本?

时间:2013-10-03 12:15:52

标签: scala

我有以下特点:

trait Mappable {
  def toMap = {
    val mappableFields = this.getClass.getDeclaredFields.filter(...)
    ...
  }
}

mappableFields列出this.declaredFields,然后将静态过滤器应用于列表;因此,它对于实现Mappable的每个类都是不变的,理想情况下我希望能够将它放在子类的单个对象或沿着这些行的东西中。我目前的解决方案是

object Mappable {
  import scala.collection.mutable.Map
  private val fieldMap = Map[Class[_], Array[Field]]()
  def getFieldMap(clazz: Class[_]) = {
    fieldMap.get(clazz) match {
      case Some(array) => array
      case _ => {
        val mapFields = clazz.getDeclaredFields.filter(...)
        fieldMap.put(clazz, mapFields)
        mapFields
      }}}}

trait Mappable {
  def toMap = {
    val mappableFields = Mappable.getFieldMap(this.getClass)
    ...
  }
}

但我想知道是否有更好的解决方案,例如一个不需要调用Map#get的人。我不能把这个特质变成一个班级。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

trait Mappable {
  def companion: MappableCompanion
  def toMap = {
    val mappableFields = companion.mappableFields
    ...
  }
}

trait MappableCompanion {
    def thisClass: Class[_]
    val mappableFields = thisClass.getDeclaredFields.filter(...)
}

Mappable的子类型也会定义一个伴随对象:

class Foo extends Mappable {
    def companion = Foo
}

object Foo extends { val thisClass = classOf[Foo] } with MappableCompanion

如果您不喜欢早期的初始化程序,可以将MappableCompanion作为一个类。