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

本文探讨了Kotlin中的object和companion object的区别和使用场景。object关键字用于实现单例模式,可以在全局或类内部定义,作为表达式使用,可访问非final局部变量。companion object则相当于Java的static,只能在类内部定义,常用于扩展类的静态成员。两者的初始化时机不同,object是即时初始化,companion object在类加载时初始化。
摘要由CSDN通过智能技术生成

一、前言

我们经常能够在 Java 相关技术博客中看到类似这样的文章: Java 中 X 种单例模式的写法。的确,单例模式是一个简单但又很重要的设计模式,特别是在多线程编程中,它的实现方法各有不同,也是适应各种不同的场合。不过,现在有了 Kotlin ,那都不是事了,忘记那个 X 吧,一个 object 关键字轻松搞定!真的,相信我,生活就是要那么容易。 :sunglasses:

在 Kotlin 中,除了 object 关键字还有个 companionobject 关键字,这个又是什么鬼?怎么使用?有啥区别?在没有仔细阅读相关文档资料之前还真有点傻傻分不清了。实践出真知,在经过简单的练习加上相关博客文章、源码阅读、谷歌搜索后,我心里所认识的 objectcompanionobject 是这样的:

  • object 可以定义在全局也可以在类的内部使用

  • object 就是单例模式的化身

  • object 可以实现 Java 中的匿名类

  • companion object 就是 Java 中的 static 变量

  • companion object 只能定义在对应的类中

但是,这些认识都是停留在表面上,在我继续阅读《 Kotlin in Action 》这本书相应章节后,我能发现它们的使用场景和功能点远不止这些!究其原因,主要是我并没有完全弄清楚它们的原理以及它们之间的差别,不论是 object 还是 companionobject ,它们的共性和区别还有这些:

  1. object 可以作为变量的定义也可以是表达式

  2. object 匿名类可以继承并超越 Java 中匿名类而实现多个接口

  3. object 表达式当场实例化,但定义的 object 变量是延迟实例化的

  4. object 和 companion object 都可以为其取名也可以隐姓埋名

  5. object 匿名内部类甚至可以引用并更改局部变量

  6. companion object 甚至还可以被扩展

  7. Java 中需要结合 @JvmStatic 和 @JvmField 使用

  8. …… 还有很多异同点等着你的开发

既然这俩兄弟有这么多异同点,那么我觉得非常有必要总结一下,以便将来能够更加得心应手地使用 Kotlin 吧。

二、正文

1. object基本定义

object 可以轻松实现 Kotlin 单例模式, 它可以定义在全局之中,也可以定义在类的内部。但是要注意几点:

  1. object 定义后即刻实例化

  2. 因此 object 不能有定义构造函数

  3. 定义在类内部的 object 并不能访问类的成员

 
 
  1. object OutObject {

  2.    val outParameter = "out"

  3.    fun outFunction(parameter:String) {

  4.        println("Out object function result: $parameter.")

  5.    }

  6. }

  7. class MyClass {

  8.    val classParameter = "class"

  9.    object InnerObject {

  10.        //val innerParameter = this.classParameter //error: 1,this refers to InnerObject 2,classParameter cannot be reached

  11.        val innerParameter = "inner"

  12.        fun innerFunction(parameter:String) {

  13.            println("Out object function result: $parameter.")

  14.        }

  15.    }

Kotlinobjectcompanion object是两不同的声明方式,它们各自适用于不同的场景。 首先,object关键字用于创建一个单例对象。它适用于只需要一个实例的类,例如全局的工具类或管理类。通过使用object关键字,我们可以将类声明为对象,并可以直接访问其的方法和属性,而无需创建该类的实例。这方式非常方便,尤其适用于需要在整个应用程序共享的实例。 另一方面,companion object是在类内部使用的一特殊对象声明方式。它可以访问类的私有成员,类似Java的静态成员。使用companion object可以创建类级别的方法和属性,而不是实例级别的。它适用于需要在类级别上访问某些成员的场景。 使用companion object可以实现工厂模式,因为它允许在类的伴生对象定义一个或多个工厂方法来创建类的实例,这些方法可以直接访问类的私有构造函数。这样,我们就可以将对象的创建逻辑封装在类内部,提供更好的封装和灵活性。 另外,当我们需要在一个类创建实例时,但不希望这个类的名称在外部可见时,也可以使用companion object。这在一些设计模式非常有用,例如单例模式或工厂模式。 总而言之,kotlin object适用于创建单例对象,而companion object适用于在类级别上访问某些成员或实现工厂模式。根据不同的需求,我们可以选择恰当的方式来使用这两声明方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值