阅读 552

详解Kotlin中的静态变量与伴生对象的使用

Kotlin中的伴生对象到底有啥用?

讲白了,这个东西你就理解成是替代java语言中的静态变量 static field 或者 static function的作用就可以了。 不要把他想的过于复杂。

Kotlin调用Kotlin的场景

直接上代码

image.png

显然 如果只是Kotlin调用Kotlin的情况 非常好理解,看上图 就是可以直接使用

类名.伴生对象fieldName 的形式 来直接访问一个变量。

注意val的变量是不能修改的,所以 Test.bbb 哪里直接报错了

Java调用Kotlin的场景

尝试用Java 来调用 刚才我们kotlin中的 Test类中的field

image.png

这里可以很方便的看出来,只有Test.ccc 这行代码是 符合我们java世界中使用静态变量的写法形式的

那么下面 Test.Companion 这种奇葩写法 肯定不行 还要get 啥的,一点也不符合 java 的使用习惯

我们可以看看Test这个kotlin 类的反编译结果 先看看是为啥会造成这种情况 然后再想办法解决这个问题

image.png

image.png

从上图中可以得知 const val 标记的ccc 这个变量 和java 中的 public static final 是完全 相符的

而没有使用const val 标记的field 就比较难受了, 虽然也是静态的 但是你要访问他们 必须通过

Companion 这个静态类 对象的 get set 方法来执行。

这里可以总结一下:

1.Kotlin调用Kotlin代码的情况下, 用不用const 在调用形式上都没有区别,都是 类名.fieldName的 使用方法即可

2.Java调用Kotlin代码的情况下,使用const val 标记的 field 才更加符合 java调用的形式

3.没有使用const标记的 field 在访问的时候 其实是有隐藏的调用开销的。因为毕竟使用了Companion 来做桥接,多使用了一个对象。

没有 const var的写法?

确实是没有的,const var 写法肯定是报错的,只有const val了。 哪有人就问了,那我的静态变量 就不能 是final的,所以我无法使用const val,因为我要改变他的值,这种情况怎么办?

image.png

这种情况你只要加上 注解就可以了, 在var filed 加上注解 就等于 const var的效果(这里有歧义 大家自行体会) 在val field 加上注解 就等于 const val的效果

反编译可以自己看看。

java call kotlin的情况 也可以完美使用

image.png

一般情况下,我们推荐在companion object 中尽可能多的使用jvm注解,这样不仅调用的时候效率更高(虽然可以忽略不计) 而且不管是java 调用还是kotlin调用 在形式上都更加符合使用习惯

我就想定义一个 Log Tag 或者 Intent Key 怎么这么麻烦!

在android 开发中,我们经常使用 静态变量 来作为log tag 或者intent key 之类的参数。java代码的时候 我们很容易就写成static final,但是在kotlin中 很多人觉得还要定义一个伴生对象这也太麻烦了

有没有更方便的写法? 答案是有的:

image.png

把他定义在 class的外部 就可以了

文章分类
Android
文章标签