对象中定义的变量的自动“列表”(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可以用反射来处理这些问题