从字符串实例化Kotlin类



我有一个类列表:

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()()

最新更新