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