
Kotlin
中的面向对象编程
|
75
当调用单例的代码时,你可以通过对象名访问它的成员,就像 Java 中的静态成员一样。
在反编译后的 Java 类中,成员函数与属性变成了静态终极(static final)方法与属性,并
且生成了所需的 getter 方法,属性随着类本身在静态块中初始化。示例 3-27 是访问成员
的 Kotlin 代码。
示例 3-27:在 Kotlin 中访问单例的成员
MySingleton.myFunction()
MySingleton.myProperty
在 Java 中使用生成的 INSTANCE 属性访问单例,参见示例 3-28。
示例 3-28:在 Java 中访问单例的成员
MySingleton.INSTANCE.myFunction();
MySingleton.INSTANCE.getMyProperty();
如果你希望用参数实例化单例,则会出现复杂情况。例如,你编写了一个数据库连接
池,这自然是一个单例。生成单例时,池的初始大小将是一个合理的输入参数。不幸的
是,Kotlin 对象无法拥有一个能够很容易地将参数传入的构造函数。
Christophe Beyls(
https://oreil.ly/P8QCv
)的博客“
Kotlin Singletons with Argument
”
讨论了使用 Kotlin 库中的 lazy 委托来实现处理带参数的单例。
引用的文章探讨了使用基于双重校验锁以及 @Volatile 来实现单例实例化线程安全的
复杂性。请参考文章中的更多细节。 ...