我是科特林的新手。我想问一下Kotlin中的私有构造函数是做什么用的? class DontCreateMe private constructor () { /*...*/ }
。我的意思是如果我们不能创建它的实例应该是什么类?
答案 0 :(得分:1)
好吧,评论中的答案是正确的,但是由于没有人写出完整的答案。我要去尝试一下。
拥有私有构造函数并不一定意味着外部代码无法使用对象。这只是意味着外部代码不能直接使用其构造函数,因此它必须通过类范围内的公开API获取实例。由于此API在类范围内,因此可以访问私有构造函数。
最简单的示例是:
class ShyPerson private constructor() {
companion object {
fun goToParty() : ShyPerson {
return ShyPerson()
}
}
}
fun main(args: String) {
// outside code is not directly using the constructor
val person = ShyPerson.goToParty()
// Just so you can see that you have an instance allocated in memory
println(person)
}
正如Mojtaba Haddadi所说,我看到的最常见的用例是实现Singleton模式,其中外部代码只能访问该类的一个实例。
一个简单的实现是:
class Unity private constructor() {
companion object {
private var INSTANCE : Unity? = null
// Note that the reason why I've returned nullable type here is
// because kotlin cannot smart-cast to a non-null type when dealing
// with mutable values (var), because it could have been set to null
// by another thread.
fun instance() : Unity? {
if (INSTANCE == null) {
INSTANCE = Unity()
}
return INSTANCE
}
}
}
fun main(args: Array<String>) {
val instance = Unity.instance()
println(instance)
}
通常使用此方法,以便仅实例化消耗资源的类一次或一次,以便整个代码库共享某些数据。
请注意,kotlin使用object keyword来实现此模式,其优点是线程安全。还有一些开发人员认为Singletons to be an anti-pattern
私有构造函数的另一个用例是实现Builder patterns,其中可以将具有复杂初始化的类抽象为更简单的API,因此用户不必处理笨拙的构造函数。该other answer解决了其在Kotlin中的用途。
我所见过的现实中Kotlin代码最简单的用途之一是来自stdlib的Result implementation上,用于更改对象的内部表示。