一,Java单例模式回顾
二,kotlin不带参数单例模式
class Singleton private constructor(){
private object Holder{
val singleton = Singleton()
}
companion object {
val INSTANCE: Singleton by lazy { Holder.singleton }
fun getInstance(): Singleton{
return INSTANCE
}
}
fun getTestString(): String{
return "shuju"
}
}
fun main(args: Array<String>){
println(Singleton.getInstance())
println(Singleton.getInstance())
println(Singleton.getInstance().getTestString())
}
输出结果:
com.xp.kotlin.part1.Singleton@7106e68e
com.xp.kotlin.part1.Singleton@7106e68e
shuju
从输出结果我们可以看到getInstance的时候对象时一个对象。
其中 companion object 有点类似于Java 中的static静态代码块
lazy有点懒加载的意思,只有在调用到的时候才会执行,并且在第二次调用的时候只返回结果,而不执行过程。
三,kotlin带参数单例模式
class Singleton1 private constructor(val str: String){
companion object {
var INSTANCE: Singleton1? = null
fun getInstance(s:String): Singleton1{
if (null == INSTANCE){
synchronized(Singleton1::class){
if (null == INSTANCE){
INSTANCE = Singleton1(s)
}
}
}
return INSTANCE!!
}
}
fun getTestString(): String{
return str
}
}
fun main(args: Array<String>){
println(Singleton1.getInstance("123"))
println(Singleton1.getInstance("234"))
println(Singleton1.getInstance("345").getTestString())
}
输入结果:
com.xp.kotlin.part1.Singleton1@76fb509a
com.xp.kotlin.part1.Singleton1@76fb509a
123
从结果我们可以看到对象时同一个对象
四,kotlin之一行实现单例模式
object Singleton2{
fun getTestString2(): String{
return "Singleton2"
}
}
fun main(args: Array<String>){
println(Singleton2)
println(Singleton2)
println(Singleton2.getTestString2())
}
输入结果:
com.xp.kotlin.part1.Singleton2@300ffa5d
com.xp.kotlin.part1.Singleton2@300ffa5d
Singleton2
从结果看是同一个对象
这种写法是Kotlin支持的写法。用object关键字即可,该对象不能创建对象Singleton2()这样是会报错的。