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 的用法的主要内容,如果未能解决你的问题,请参考以下文章