对象中定义的变量的自动“列表”(scala)
考虑以下程序。有一堆类型定义、一个特征和一个扩展该特征的对象 这是我程序的一个非常简单的版本。类型定义和特征在程序内,用户应填写对象内的详细信息:对象中定义的变量的自动“列表”(scala),scala,Scala,考虑以下程序。有一堆类型定义、一个特征和一个扩展该特征的对象 这是我程序的一个非常简单的版本。类型定义和特征在程序内,用户应填写对象内的详细信息: /* ---------------------------------------------------*/ /** the internal program */ case class Type1() case class Type2() case class Type3() trait aTrait { // some
/* ---------------------------------------------------*/
/** 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
,它是用户定义的所有变量的列表。问题是是否可以自动定义和填充此变量(可能在aTrait
trait中) 这让我想起了枚举的内容。我认为只有通过对象中的可变状态或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()))
但是,我不能保证并发无问题那么在别处创建的TypeN类的其他实例呢?或者他们在对象中创建的所有调用?仅此特定的对象
。事实上,这种用法是有限的。这是可以扩展aTrait
的对象。因此,不要担心其他任何地方。当程序开始运行时,将计算行defall:List[Value[]]=registry.toList
;正确的?如果是这样的话,因为我将使用all
中的值(并且不向其中添加任何内容),所以我认为它不会产生任何并发性问题。@Daniel对于普通的应用程序来说,它应该没问题。在更复杂的情况下,我甚至还可以。我只是想指出,在使用它的时候,你应该记住线程的安全性。有可能用某种反射技术来处理这个问题吗?看起来java可以用反射来处理这些问题