2013-10-03 84 views
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。我不能把這個特質變成一個班級。

+0

實現trait中的所有邏輯,然後創建實現這個特徵的對象應該可以工作。在每種情況下,getClass都意味着特定的子類/對象...我希望我能正確理解你要完成的任務 –

回答

0

你可以做這樣的事情:那麼Mappable

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

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

亞型也會定義一個同伴對象:

class Foo extends Mappable { 
    def companion = Foo 
} 

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

如果你不喜歡早期的初始化可以使MappableCompanion一個類。