考虑以下计划。有一堆类型定义,一个特征,以及一个扩展这个特征的对象。
这是我程序的一个非常简化的版本。类型定义和特征在程序内部,用户应该填写对象内的细节:
/* ---------------------------------------------------*/
/** the internal program */
case class Type1()
case class Type2()
case class Type3()
trait aTrait {
// some stuff here
}
/* ---------------------------------------------------*/
/** user side */
object samepleObject extends aTrait {
val object1 = new Type1()
val object2 = new Type1()
val object3 = new Type2()
val object4 = new Type3()
// list of all objects here
// this definition should be populated automatically.
val all = List(object1, object2, object3, object4)
}
用户应该定义一组变量(可能是不同类型)。变量all
是用户定义的所有变量的List
。问题是可以自动定义和填充此变量(可能在aTrait
特征内)?
答案 0 :(得分:3)
这让我想起了Enums
。我认为你只能在你的对象或aTrait
中实现具有可变状态的东西。这也意味着handlinf线程安全。
您可以执行类似
的操作/* ---------------------------------------------------*/
/** the internal program */
case class Type1()
case class Type2()
case class Type3()
import scala.collection.mutable
trait aTrait {
private[this] var registry = mutable.ListBuffer.empty[Value[_]]
case class Value[T](value: T) {
registry.synchronized { registry :+= this }
}
def all: List[Value[_]] = registry.toList
}
/* ---------------------------------------------------*/
/** user side */
object sampleObject extends aTrait {
val object1 = Value(new Type1())
val object2 = Value(new Type1())
val object3 = Value(new Type2())
val object4 = Value(new Type3())
}
val test = sampleObject.all
> test: List[sampleObject.Value[_]] = List(Value(Type1()), Value(Type1()), Value(Type2()), Value(Type3()))
但是,我不保证并发无问题