Scala动态存储库

时间:2012-06-04 11:38:29

标签: scala

我对scala很新。我试图创建一种动态存储库。我如何阅读简单案例类的属性?

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] {}

2 个答案:

答案 0 :(得分: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 [Product])。

答案 1 :(得分:1)

为什么不将您的实体表示为地图?然后,您可以轻松地将键作为属性进行迭代,并执行Scala映射可以执行的所有其他奇特的操作。

如果要隐藏表示,则应使用合成,即将地图存储为私有字段。

这样的事情可以让你开始:

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