【发布时间】:2018-06-20 07:05:14
【问题描述】:
我正在尝试使用在子类中初始化的属性构建一个字符串。
我阅读了有关延迟初始化的信息,但不知何故,这并没有像我预期的那样工作。
abstract class SubProcessFullNameBuilder(technicalDomain: TechnicalDomainEnumeration) {
protected val moduleName = "td.${technicalDomain.value().toLowerCase()}.shared"
private val packageName by lazy { packageName() }
private val processName by lazy { processName() }
val processFullName: String = "$moduleName/$packageName.$processName"
protected abstract fun packageName(): String
protected abstract fun processName(): String
}
class WorkerFullNameBuilder(
private val jmsDirection: JmsDirectionEnumeration,
technicalDomain: TechnicalDomainEnumeration,
private val cdmCode: String) : SubProcessFullNameBuilder(technicalDomain) {
override fun packageName() = "$moduleName.workers.${jmsDirection.value().toLowerCase()}.${cdmCode.toLowerCase()}"
override fun processName() = "Worker"
}
由于我已经覆盖了packageName() 和processName() 属性,我希望在调用packageName 属性时它会使用子类中的实现。
但是当我调用processFullName 属性时,它会抛出一个java.lang.NullPointerException。
val builder = WorkerFullNameBuilder(JmsDirectionEnumeration.ESB_IN, TechnicalDomainEnumeration.INFOR, "ccmd")
val name = builder.processFullName
如何正确初始化 packageName 和 processName 属性?
【问题讨论】:
标签: kotlin lazy-initialization