Kotlin 关键字 object 的用法
Posted 云在千峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 关键字 object 的用法相关的知识,希望对你有一定的参考价值。
问题:在 Java 中会经常使用单例对象,有时候还要求单例对象是线程安全的,创建单例对象需要编写不少代码。
那么, Kotlin 中是如何创建单例对象的呢? 答案是 object
关键字。
object 关键字
Kotlin 使用 class
来创建类,使用 object
来创建单例对象。下面是一个最简单的单例对象和使用单例对象的例子:
//创建单例对象
object Test {}
//使用单例对象
class UseTest{
val test = Test
}
抽象类或者接口实现单例
object
也可以实现一个接口或者成为父类的子类,这样创建的对象就是实现了某个接口的单例对象了。比如:
toolbar.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
}
})
上面类似于 Java 中的匿名内部类。
当然也可以定义带有名字的单例:
// 带名字的单例
object Listener : View.OnClickListener{
override fun onClick(v: View?) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 使用单例 Listener
toolbar.setOnClickListener(Listener)
伴生对象(Companion Object)
当我们想把 android.app.Application#Application
作为静态变量暴露给其他地方使用的时候,需要使用伴生对象了,如下:
class App : Application() {
companion object {
private const val TAG = "App"
lateinit var app: App
private set
}
// 如果应用中有 ContentProvider 并使用了 App 单例对象
// 则需要在 这个函数中初始化单例对象而不是 onCreate 函数
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
app = this
}
}
关于上面代码的几点说明:
由于 Application 是系统来创建的,所以我们没法直接把该对象变成一个单例
如果像把 Application 示例通过静态方法暴露出去,则需要使用
companion object
,类似于 Java 中的静态变量在伴生对象中定义了一个
lateinit var app: App
变量,app
变量是稍后初始化的 App 类型的对象,由于位于 伴生对象 中,所以是个单例,等价于 Java 中的静态变量定义在
attachBaseContext
中给app
变量赋值为 当前 的 App 对象
注意伴生对象中的
private set
定义,默认情况下 Kotlin 中的 Field 都自动带有一个公开的赋值和读取函数,类似于 Java bean 中的getter
和setter
函数。上面的private set
重新定义了setter
函数为 私有类型的,这样在其他地方就只能读取app
变量而无法修改这个变量,防止该变量被其他人修改从而实现单例的目的。
以上是关于Kotlin 关键字 object 的用法的主要内容,如果未能解决你的问题,请参考以下文章