相关文章推荐
豪气的红豆  ·  使用requests + ...·  5 月前    · 
风度翩翩的镜子  ·  nginx ...·  10 月前    · 

Kotlin实战--消除静态工具类:顶层函数和属性

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"

第二步:点击右侧“Decompile”

我们会得到另外一个文件

通过以上的代码可以总结出两点内容:

  1. 顶层文件会反编译成一个容器类。(类名一般默认就是顶层文件名+"Kt"后缀,注意容器类名可以自定义)
  2. 顶层函数会反编译成一个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  * @Description:  */   val name:String="kotlin" var type:String="language"

用法和顶层方法一样,这里就不赘述了。

4.写在最后

顶层属性和方法可以让我们的代码更加简洁,而且不需要引入多于的类。顶层函数在Kotlin里面用法也很广泛,我们最常用的let()方法就是顶层方法。后面会单独讲到Kotlin常用的顶层方法。

原文链接: Kotlin实战--消除静态工具类:顶层函数和属性 - 掘金

编辑于 2021-12-03 10:17