我有以下特点:
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的人。我不能把这个特质变成一个班级。
答案 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
作为一个类。