学习
实践
活动
专区
工具
TVP
写文章

Kotlin 中的伴生对象和静态成员

作者主页:

https://www.jianshu.com/p/214f18e8b835

一、前言

最近公司开发的项目使用的是 Kotlin,所以不得不学起来 Kotlin 这门语言了,毕竟是 Android 官方的第一开发语言嘛!在平时的开发中,我习惯将启动 Activity 的方法以静态方法的形式定义在目标 Activity 中,如下:

这样写的好处就是方便调用者调用,调用者可以清晰的知道目标 Activity 需要什么参数,而且不用关心传参的 key。但是在 Kotlin 中并不没有 这个关键字,该如何处理呢?这里需要用到 Kotlin 的伴生对象来处理。所以本文主要介绍 Kotlin 中伴生对象的应用。

二、伴生对象

1、声明:

Kotlin 中,在类中定义的对象(object)声明,可使用 修饰,这样此对象(object)就是伴生对象了。如下例子:

在本例中,类 NumberTest 中就声明了一个伴生对象,包含属性 和 方法 。但是一个类(class)中最多只能定义一个伴生对象。

2、调用

使用 关键字修改的对象之后,伴生对象就相当于是外部类的对象,我们可以使用类直接调用,如下:

从上面的代码可以看出调用的时候与伴生对象的名称没有多大关系,所以名称 可以省略不写。

3、伴生对象的作用

通过上面的 和 代码不难看出来,类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。可见,伴生对象的主要作用就是为其所在的外部类模拟静态成员。

4、与 Java 代码共存

知道了伴生对象的特点之后,那么我们如何与 Java 代码共存呢?也就是如何在 Java 代码中调用 Kotlin 的伴生对象呢?如下:

如果声明伴生对象有名称,则使用:

如果声明伴生对象无名称,则采用 关键字调用:

5、@JvmField 和 @JvmStatic 的使用

在上面的例子中,我们知道了可以在 Java 代码中调用 Kotlin 中伴生对象的成员,类似于 Java 类中的静态成员。但是看上去和 Java 中的还是略有区别,因为类名和方法名/属性setter,getter方法名之间多了个伴生对象的名称或者 Companion 关键字。如何使其在调用的时候与 Java 中的调用看上去一样呢?

Kotlin 为我们提供了 和 两个注解。 使用在属性上, 使用在方法上。如:

这样我们在 Java 代码中调用的时候就和 Java 类调用静态成员的形式一致了,Kotlin 代码调用方式不变:

6、const 关键字

在伴生对象中,我们可能需要声明一个常量,目的是等同于 Java 中的静态常量。有两种方式,一种是上面所提到的使用 注解,另一种则是使用 关键字修饰。这两种声明方式都等同于 Java 中 static final 所修饰的变量。如下代码:

如果不使用 const 修饰的常量,我们需要引用伴生对象来调用,而且必须调用 getter 方法。

而以上 const 关键字使用的影响只是在 Java 中调用方式不同,在 Kotlin 中并无影响。

三、伴生对象的扩展

如果了解 Kotlin 的话,应该知道在 Kotlin 中,对象时可以被扩展的。在 Kotlin 中,如果类中包含伴生对象,则 Kotlin 允许伴生对象扩展方法和属性。也就是为伴生对象所在的外部类扩展静态成员,访问方式一致。

接着上面的列子,为上面的 类扩展一个 方法:

1、扩展方法

通过例子我们看出,我们可以通过类名去扩展方法,如果伴生对象有名称的话,使用 来扩展,否则使用 来扩展即可。

2、扩展属性

同样,我们也可以扩展属性,但是扩展属性有以下几个特点:

扩展属性不能有初始值,没有 来存储属性值;

扩展属性因为没字段来存储值,所以为计算属性;

扩展 var 属性必须提供 setter 和 getter 方法,扩展 val 属性必须提供 getter 属性。

四、总结

先来个小插曲,回归到本文前言,定义在 Activity 中的启动方法,用到伴生对象可以写成如下格式:

每个类可以最多有一个半生对象;

伴生对象的成员类似于 Java 的静态成员;

使用 const 关键字修饰常量,类似于 Java 中的 static final修饰。

可以使用 @JvmField 和 @JvmStatic 类似于 Java 中调用静态属性和静态方法;

伴生对象可以扩展属性和扩展方法。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602G1MH4P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券