3

我有以下特点:

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 的解决方案。我不能把特质变成一个类。

4

1 回答 1

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一个类。

于 2013-10-24T08:10:01.503 回答