从字符串实例化 Kotlin 类

SCK*_*SCK 0 instantiation kotlin

我有一个课程列表:

val availableClasses = listOf<Whatever>(
    classA(),
    classB(),
    classC()
)
Run Code Online (Sandbox Code Playgroud)

我使用以下方法从该列表中随机选择一个项目:

private var selection: Whatever = availableClasses.random()
Run Code Online (Sandbox Code Playgroud)

不幸的是,我认为这种方法是在加载列表时实例化列表中包含的每个类。

我希望通过用字符串列表替换类列表来解决这个问题:

val availableClasses = listOf<String>(
    "classA",
    "classB",
    "classC"
)
Run Code Online (Sandbox Code Playgroud)

然后一旦我选择了一个字符串,就只实例化那个字符串;就像是:

private var selection: String = availableClasses.random()
// pseudo-code
val chosenClass = selection.toClass()
Run Code Online (Sandbox Code Playgroud)

我可以使用带有getattr函数的字符串来引用 Python 中的类。

在 Kotlin 中有这样的事情吗?

我也愿意接受更好的方法来解决这个问题。

Ten*_*r04 5

通过字符串名称实例化类比使用构造函数更容易出错,因为它依赖于使用完全限定的、拼写正确的名称,以及具有特定构造函数(空或具有特定参数)的类。所以它可以完成,但是当有更安全的方法时应该避免(如果你做错了编译器会给你一个错误的方式,而不是只有在你运行编译程序后才会出现错误) .

如果我理解正确,您需要一个只能随机实例化一次的类列表。一种方法是制作一个类构造函数列表。

val classConstructors = listOf<() -> Any>(
    ::ClassA,
    ::ClassB,
    ::ClassC
)

val randomInstantiatedClass = classConstructors.random()()
Run Code Online (Sandbox Code Playgroud)