【发布时间】:2020-08-16 21:46:15
【问题描述】:
我在 Kotlin 中有以下数据类
data class AppInfoBO constructor(
val appVersion: String
) {
val majorVersion: Int?
val minorVersion: Int?
init {
val matches = majorVersionRegex.find(appVersion)
if (matches != null) {
majorVersion = matches.groups[1]?.value?.toInt()
minorVersion = matches.groups[2]?.value?.toInt()
} else {
majorVersion = null
minorVersion = null
}
}
companion object {
@JvmField
val UNKNOWN = AppInfoBO("UNKNOWN")
@JvmStatic
val majorVersionRegex = Regex("""(\d+)\.(\d+)\.""")
}
当我尝试运行它时,它抱怨伴随对象内的majorVersionRegex 为空。
如果我将 majorVersionRegex 移动到 kotlin 对象中,它可以正常工作。
private object RegexHolder {
val majorVersionRegex = Regex("""(\d+)\.(\d+)\.""")
}
我正在尝试将 majorVersionRegex 设为静态变量,因此不需要一遍又一遍地编译正则表达式。
有没有更好的方法呢?这真的感觉像是一个 hack。
【问题讨论】:
-
一开始我认为这看起来不错,正如预期的那样,我在测试时是unable to reproduce this。也许更多细节会有所帮助?你是如何创建这个数据类的实例的?
-
如果您尝试在伴随对象中初始化常量
AppInfoBO并且在声明正则表达式之前,将会有一个 NPE。不确定这是否是您的情况,但您可以将声明移到正则表达式之后。 -
@Nicolas 你成功了!!考虑到我原来的帖子忽略了这一点,非常令人印象深刻!如果你想写一个答案,我很乐意给你信用!
标签: kotlin