【解密 Kotlin 扩展函数】顶级函数和顶级属性(十五)

打印 上一主题 下一主题

主题 1685|帖子 1685|积分 5055

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.1.1 摆脱静态实用类的束缚–顶级函数


  • 我们都知道,作为一种面向对象的语言,Java要求将所有代码都写成类的方法

    • 通常情况下,这样做效果很好,但在实际中,几乎每个大型项目

      • 最终都会产生大量不属于任何一个类的代码

    • 偶尔,一个操作会与两个不同类的对象一起工作

      • 这两个类对该操作起着同等紧张的作用

    • 另有一些时候,虽然只有一个主对象

      • 不想通过将操作添加为实例方法来臃肿其 API

    • 因此,你最终会得到不包含任何状态或实例方法的类—实用工具类

      • 这种类只充当几个静态方法的容器

    • JDK 中的 Collections 类就是一个很好的例子

      • 要在开源项目中找到其他例子,请查找名称中包含 Util 的类


  • 在 Kotlin 中,不必要创建那些毫无意义的类

    • 相反,可以直接将函数放在源文件的顶层,任何类的外边

      • 这些函数仍然是文件顶层声明的包的成员

    • 如果想从其他包中调用这些函数,仍然必要导入它们

      • 不必要的额外嵌套层不复存在


  • 创建一个名为 Join.kt 的文件,直接将 joinToString 函数放到 strings 包

    • 关于joinToString 函数的实现–传送门

  1. package strings
  2. @JvmOverloads
  3. fun <T> joinToString(
  4.     collection: Collection<T>,
  5.     separator: String = ", ",
  6.     prefix: String = "",
  7.     postfix: String = ""
  8. ) : String {
  9.     val result = StringBuilder(prefix)
  10.     for ((index, elem) in collection.withIndex()){
  11.         if (index > 0) result.append(separator)
  12.         result.append(elem)
  13.     }
  14.     result.append(postfix)
  15.     return result.toString()
  16. }
复制代码

  • 如今,让我们看看编译成相同类的 Java 代码

    • <1> 可以看到,Kotlin 编译器生成的类名包含函数的文件名同等

      • 大写以匹配 Java 的定名规范,后缀为 Kt

    • <2> 文件中的所有顶级函数被编译为该类的静态方法
    • <3> 因此, 从 Java 中调用该函数像调用其他静态方法一样简单

  1. /* Java */
  2. package strings;
  3. public class JoinKt {                                       // <1>
  4.     public static String joinToString(// ... ) { // ...  }  // <2>
  5. }
  6. ===========================================================
  7. /* Java */
  8. import strings.JoinKt;
  9. // ...
  10. JoinKt.joinToString(list, ", ", "", "");                   // <3>
复制代码
1.1.2 更改顶级声明所在的类名


  • 默认情况下,编译器生成的类名与文件名相对应,并带有 Kt 后缀

    • 更改包含 Kotlin 顶级函数的生成类名称

      • 可以添加一个 JvmName 注解

    • <1> 将其放在文件开头,包名之前
    • <2> 此时在Java代码中导入时, 可以直接利用新定名"StringFunctions"

  1. @file:JvmName("StringFunctions")                     // <1>package strings
  2. @JvmOverloads
  3. fun <T> joinToString(
  4.     collection: Collection<T>,
  5.     separator: String = ", ",
  6.     prefix: String = "",
  7.     postfix: String = ""
  8. ) : String {
  9.     val result = StringBuilder(prefix)
  10.     for ((index, elem) in collection.withIndex()){
  11.         if (index > 0) result.append(separator)
  12.         result.append(elem)
  13.     }
  14.     result.append(postfix)
  15.     return result.toString()
  16. }
  17. ======================================================import java.util.List;import strings.StringFunctions;                                 // <2>public class Example {    public static void main(String[] args){        System.out.println(StringFunctions.joinToString(List.of("1", "2")));    }}
复制代码
1.1.3 顶层属性


  • 与函数一样,属性也可以放在文件的顶层

    • 在类外部存储单个数据并不常见,但仍然很有用
    • 例如,你可以利用 var 属性来计算某些操作的实行次数
    • <1> 声明顶级属性
    • <2> 改变属性的值
    • <3> 读取属性的值

  1. var opCount = 0                     // <1>
  2. fun performOperation() {
  3.     opCount++                       // <2>
  4.     // ...
  5. }
  6. fun reportOperationCount() {
  7.     println("Operation performed $opCount times")     // <3>
  8. }
复制代码

  • 顶级属性还答应在代码中定义常量: val UNIX_LINE_SEPARATOR = “\n”

    • 默认情况下,顶层属性与其他属性一样

      • 以访问器方法的形式暴露给 Java 代码
      • val 属性的 getter 和 var 属性的 getter-setter 对

    • <1> 如果想将常量作为"public static final"字段暴露给 Java 代码

      • 使其利用更自然,可以利用 const 修饰符对其进行标志

        • 对基本类型和String类型的属性都是答应的


    • <2> 与顶级函数一样,顶级属性在编译后会酿成Java的静态字段

      • 由于这里利用const修饰属性,所以会得到"public static final"字段*


  1. const val UNIX_LINE_SEPARATOR = "\n"            // <1>
  2. =============================================== // <2>
  3. /* Java */
  4. public static final String UNIX_LINE_SEPARATOR = "\n";
复制代码

  • 注意 Kotlin 标准库还包含几个有用的顶级函数和属性

    • kotlin.math 包就是一个例子

      • 为典型的数学运算和三角运算提供有用的函数

    • <1> 例如用于计算两个数字最大值的 max 函数

      • 它还提供许多数学常量,如欧拉数或圆周率


  1. fun main() {
  2.     println(max(PI, E))          // <1>
  3.     // 3.141592653589793
  4. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表