Kotlin实战--消除静态工具类:顶层函数和属性
原创![作者头像](https://ask.qcloudimg.com/random-avatar/9249747/yqeni8uohy.png)
1.引入
我们都知道, Java 作为 门面向对象的语言,需要所有的代码都写作类的函数。大多数情况下,这种方式还能行得通。但事实上,几乎所有的大型项目,最终都有很多的代码并不能归属到任何 个类中。有时一个操作对应两个不同的类的对象,而且重要性相差无几。有时存在 个基本的对象,但你不想通过实例函数来添加操作,让它的 API 继续膨胀。结果就是,最终这些类将不包含任何的状态或者实例函数,而是仅仅作为一堆静态函数的 容器 。在 JDK 中, 最适合的例子应该就是 Collections了。看看你自己的代码,是不是也有一些类本身就以Util作为后缀命名。 在kotlin中,根本就不需要去创建这些无意义的类, 相反,可以把这些函数接放到代码文件的顶层,不用从属于任何的类。这些放在文件顶层的函数依然是包内的成员,如果你需要从包外访问它,则需要 import 但不再需要额外包一层。
2.顶层函数
见名知意,原来在Java中,类处于顶层,类包含属性和方法,在Kotlin中,函数站在了类的位置,我们可以直接把函数放在代码文件的顶层,让它不从属于任何类。就像下面这样,我们在一个Test.kt文件中写入如下的Kotlin代码。
package com.smartcentury.agriculturalmarket.utils
fun getKotlin():String{
return "Kotlin"
}
现在我们看一下如何在其他包中引用它:
import com.smartcentury.agriculturalmarket.utils.getKotlin
getKotlin()
我们只需要导入包,然后直接调用就可以了。
但是我们可能会有个疑问,如果我们想要在Java中调用这个方法应该如何调用呢?
在Java中调用Kotlin顶层函数。
要想知道如何在Java中调用顶层函数其实很简单,我们只要将Kotlin反编译一下就可以了。下面介绍下如何反编译Kotlin代码 。
第一步:在IDE中打开你需要查看反编译的代码文件,然后打开顶部的"Tools",选择"Kotlin",再选择"Show Kotlin ByteCode"
![](https://ask.qcloudimg.com/http-save/9249747/e3be1413784e713af34641283587aabd.png)
第二步:点击右侧“Decompile”
![](https://ask.qcloudimg.com/http-save/9249747/dda79a3f2add8424b81add25a27d31f8.png)
我们会得到另外一个文件
![](https://ask.qcloudimg.com/http-save/9249747/824b388c5c7d0244ab4569a89f36de6a.png)
通过以上的代码可以总结出两点内容:
- 顶层文件会反编译成一个容器类。(类名一般默认就是顶层文件名+"Kt"后缀,注意容器类名可以自定义)
- 顶层函数会反编译成一个static静态函数,如代码中的getKotlin函数
现在我们应该知道如何在java代码中如何调用了吧。
TestKt.getKotlin();
可能有时候你觉得Kotlin为你自动生成的这个类名不好,那你可以通过@file:JvmName注解来自定义类名,就像下面这样。
@file:JvmName("MyKotlin")
package com.smartcentury.agriculturalmarket.utils
* @Author: Simon
* @CreateDate: 2019/5/16 16:04
* @Description:
fun getKotlin():String{
return "Kotlin"
}
而且要注意,这个注解必须放在文件的开头,包名的前面。
于是我们在Java文件中可以这样调用
MyKotlin.getKotlin();
3.顶层属性
了解了顶层函数,下面再看看顶层属性。顶层属性也就是把属性直接放在文件顶层,不依附于类。我们可以在顶层定义的属性包括var变量和val常量,就像下面这样。
@file:JvmName("MyKotlin")
package com.smartcentury.agriculturalmarket.utils
* @Author: Simon
* @CreateDate: 2019/5/16 16:04