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
 }
}

关于上面代码的几点说明:

  1. 由于 Application 是系统来创建的,所以我们没法直接把该对象变成一个单例

  2. 如果像把 Application 示例通过静态方法暴露出去,则需要使用companion object ,类似于 Java 中的静态变量

  3. 在伴生对象中定义了一个 lateinit var app: App 变量, app 变量是稍后初始化的 App 类型的对象,由于位于 伴生对象 中,所以是个单例,等价于 Java 中的静态变量定义

  4. attachBaseContext 中给 app 变量赋值为 当前 的 App 对象

注意伴生对象中的 private set 定义,默认情况下 Kotlin 中的 Field 都自动带有一个公开的赋值和读取函数,类似于 Java bean 中的 gettersetter 函数。上面的 private set 重新定义了 setter 函数为 私有类型的,这样在其他地方就只能读取 app 变量而无法修改这个变量,防止该变量被其他人修改从而实现单例的目的。

以上是关于Kotlin 关键字 object 的用法的主要内容,如果未能解决你的问题,请参考以下文章

对比Java学Kotlinobject 关键字

对比Java学Kotlinobject 关键字

对比Java学Kotlinobject 关键字

区别Kotlin中的object和companion object关键字

Kotlin 初学者单例类(object)

kotlin-object关键字与单例模式