这里可以很方便的看出来,只有Test.ccc 这行代码是 符合我们java世界中使用静态变量的写法形式的
那么下面 Test.Companion 这种奇葩写法 肯定不行 还要get 啥的,一点也不符合 java 的使用习惯
我们可以看看Test这个kotlin 类的反编译结果 先看看是为啥会造成这种情况 然后再想办法解决这个问题
从上图中可以得知 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 val了。 哪有人就问了,那我的静态变量 就不能 是final的,所以我无法使用const val,因为我要改变他的值,这种情况怎么办?
这种情况你只要加上 注解就可以了, 在var filed 加上注解 就等于 const var的效果(这里有歧义 大家自行体会) 在val field 加上注解 就等于 const val的效果
反编译可以自己看看。
java call kotlin的情况 也可以完美使用
一般情况下,我们推荐在companion object 中尽可能多的使用jvm注解,这样不仅调用的时候效率更高(虽然可以忽略不计) 而且不管是java 调用还是kotlin调用 在形式上都更加符合使用习惯
我就想定义一个 Log Tag 或者 Intent Key 怎么这么麻烦!
在android 开发中,我们经常使用 静态变量 来作为log tag 或者intent key 之类的参数。java代码的时候 我们很容易就写成static final,但是在kotlin中 很多人觉得还要定义一个伴生对象这也太麻烦了
有没有更方便的写法? 答案是有的:
把他定义在 class的外部 就可以了
大家如果还想了解更多Android 相关的更多知识点,可以点进我的【GitHub项目中:https://github.com/733gh/GH-Android-Review-master】自行查看,里面记录了许多的Android 知识点。最后还请大家点点赞支持下!!!
总结
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!