我在 Kotlin 中有一个类,我永远不想通过主构造函数实例化它。两个次构造函数最终都会根据其参数初始化一个属性,我想确保该属性已初始化(主构造函数不会初始化该属性)。
我想将我的属性声明为 lateinit,然后进行测试以确保它在执行任何类方法之前已初始化(例如作为构造的最后一步),以生成某种有意义的错误。我不想在每个类方法中引入保护。
以下是一个例子:
class ElementsContainer() {
private lateinit var elements: Elements
constructor(url: String): this() {
val doc = Jsoup.connect(url).get()
elements = doc.body().select("*")
}
constructor(newElements: Elements): this() {
elements = newElements
}
...
}
有没有一种方法可以让我的类elements
在构造结束时(通过this::elements.isInitialized
)进行最终检查以验证其是否已被初始化,如果没有,则构造失败(例如,引发异常)?
您的一个次要构造函数只是将
Elements
实例放入私有属性中。另一个似乎更像是用于创建Elements
实例的“实用函数”,而不是构造函数。这可能可以更好地实现如下:如果您需要,该
elements
属性仍然可以保留var
。最好将其移至fromUrl
单独的函数object
甚至顶级函数。如果不想使用主构造函数,可以将其设为私有:
但是如果你希望
elements
它始终可用,那么你应该强制要求主构造函数: