2012-06-04 105 views
1

我很新的斯卡拉。我試圖創建一種動態存儲庫。我如何閱讀簡單案例類的屬性?斯卡拉動態庫

trait Repository[T <:MetaEntity] { 

    persist(entity:T) : Boolean { 
     // TO BE IMPLEMENTED 

     // Pseudo code: 
     for (attribute <- getAttributes()) { 
      // Flatten properies to one string... 
      // Primitives can be converted with attribute.value.toString ? 
      // Type: attribute.type ? 
      // Object references should be coverted to object.id.toString ? 
     } 
    } 

} 

abstarct class MetaEntity {} 

case class SimpleEntity(id: Int, name: String, version: Int) extends MetaEntity { 
} 

case class ComplexEntity(id: Int, name: String, simpleChild: SimpleEntity) extends MetaEntity{} 

object ComplexEntityRepository extends Repository[ComplexEntity] {} 
object SimpleEntityRepository extends Repository[SimpleEntity] {} 

回答

1

爲什麼不只是將您的實體表示爲地圖?然後,您可以輕鬆地遍歷鍵作爲屬性,並執行Scala映射可以完成的所有其他花哨的事情。

如果你想隱藏表示,那麼你應該使用合成,即將地圖存儲爲私人領域。

像這樣的東西可以讓你開始:

class Entity { 
    private[this] val map = collection.mutable.Map[String, Any]() 
    def name = map("name").asInstanceOf[String] 
    def attributes = map.keys 
    ... 
} 
+0

謝謝您的回答!似乎是直接的方式。是否有可能創建類似這樣的:class MyEntity extends Entity {object name extends NameField(owner = this)}(我在網上看到過類似的代碼,但不知道它是如何工作的)? – Alebon

+0

我已更新我的示例以顯示這可如何用於虛擬字段「名稱」。 –

+0

我不知道你的用例。可能你應該簡單地使用普通類並堅持XML或JSON。網上有一些很好的文章。在這裏解釋會太長。 –

1

scala中的案例類擴展Product(請參閱here)。 也許下面的代碼將幫助你(REPL會話):

scala> trait MetaEntity extends Product 
defined trait MetaEntity 

scala> case class Test(i: Int, j: Int) extends MetaEntity 
defined class Test 

scala> def test[T <: MetaEntity](t: T) = { 
    | for (elem <- t.productIterator) 
    |  println(elem.getClass.getName + " " + elem) 
    | } 
test: [T <: MetaEntity](t: T)Unit 

scala> test(Test(1,2)) 

java.lang.Integer 1 
java.lang.Integer 2 

要閱讀「內部」的產品,你可以做類型檢查(例如iter.next.isInstanceOf [產品])的屬性。