2013-10-03 2 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

특성의 모든 논리를 구현 한 다음이 특성을 구현하는 개체를 만들어야 작동합니다. 각각의 경우에 getClass는 특정 하위 클래스/객체를 의미합니다 ... 나는 당신이 성취하고자하는 것을 정확히 이해하기를 바랍니다. –

답변

0

당신은 같은 것을 할 수있는 : 당신은 초기 초기화가 마음에 들지 않으면

class Foo extends Mappable { 
    def companion = Foo 
} 

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

당신이 MappableCompanion을 만들 수 있습니다 Mappable

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

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

서브 타입은 다음 또한 동반자 객체를 정의 할을 수업.

관련 문제