我有一个类列表:
val availableClasses = listOf<Whatever>(
classA(),
classB(),
classC()
)
我使用从这个列表中随机选择一个项目
private var selection: Whatever = availableClasses.random()
不幸的是,我认为这种方法是在加载列表时实例化列表中包含的每个类。
我希望通过用字符串列表替换类列表来解决这个问题:
val availableClasses = listOf<String>(
"classA",
"classB",
"classC"
)
然后,一旦我有了一个选定的字符串,就只实例化那个字符串;类似于:
private var selection: String = availableClasses.random()
// pseudo-code
val chosenClass = selection.toClass()
我可以使用带getattr
函数的字符串引用Python中的类。
在科特林有这样的可能吗
我也对解决这个问题的更好方法持开放态度。
通过字符串名称实例化类比使用构造函数更容易出错,因为它依赖于使用完全限定的、拼写正确的名称,以及具有特定构造函数的类(可以是空的,也可以是带特定参数的(。因此,它是可以做到的,但当有更安全的方法时应该避免(如果你做错了,编译器会给你一个错误,而不是只有在你运行编译后才会出现错误(。
如果我理解正确的话,您需要一个类的列表,这些类每次只能随机实例化一个。一种方法是列出类构造函数。
val classConstructors = listOf<() -> Any>(
::ClassA,
::ClassB,
::ClassC
)
val randomInstantiatedClass = classConstructors.random()()