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 に答える