顶层函数

顶层函数

创建一个名为 Join.kt 的文件:

  1. package strings
  2. fun joinToString(...): String { ... }

他会被编译成以下 Java 代码

package strings;
public class JoinKt {
    public static String joinToString(...) { ... }
}

然后,在 Java 中可以按照如下方法使用它

import strings.JoinKt;
...
JoinKt.joinToString(list, ", ", "", "");

Kotlin 顶层函数相当于 Java 中的静态函数,往往我们在 Java 中会用到类似 Utils 的类来放置不属于任何类的公共静态函数。

顶层属性

const val UNIX_LINE_SEPARATOR = "\n"

这个等同于下面的 Java 代码:

public static final String  UNIX_LINE_SEPARATOR = "\n";

作者:蒋扬海 链接:https://www.jianshu.com/p/88e1a65bcedb 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

扩展函数

  1. 类似于在 Java 中实现的静态工具方法。
  2. 扩展函数一般放在包中,这样就能全局通用了

**
扩展函数用于为一个类增加一种新的行为,这是为缺少有用函数的类进行扩展的途径。扩展函数的用途就类似于在 Java 中实现的静态工具方法。而在 kotlin 中使用扩展函数的一个优势就是我们不需要在调用方法的时候把整个对象当作参数传入,扩展函数表现得就像是属于这个类本身的一样,可以使用 this 关键字并直接调用其所有 public 方法

扩展函数并不是真正地修改了原来的类,其底层其实是以静态导入的方式来实现的。扩展函数可以被声明在任何一个文件中,因此有个通用的实践是把一系列有关的函数放在一个新建的文件里
需要注意的是,扩展函数不会自动地在整个项目范围内生效,如果需要使用到扩展函数,需要进行导入

//为 String 类声明一个扩展函数 lastChar() ,用于返回字符串的最后一个字符
//get方法是 String 类的内部方法,length 是 String 类的内部成员变量,在此处可以直接调用
fun String.lastChar() = get(length - 1)

//为 Int 类声明一个扩展函数 doubleValue() ,用于返回其两倍值
//this 关键字代表了 Int 值本身
fun Int.doubleValue() = this * 2

类java的static静态函数

伴生对象

如果需要一个可以在没有类实例的情况下调用但是需要访问类内部的函数(类似于 Java 中的静态变量/静态函数),可以将其写成那个类中的对象声明的成员
通过关键字 companion ,就可以获得通过容器类名称来访问这个对象的方法和属性的能力,不再需要显式地指明对象的名称

class Test {
    companion object {
        const val NAME = ""
        fun testFun() {
        }
    }
}
fun main() {
    Test.NAME
    Test.testFun()
}

工厂模式

可以利用伴生对象来实现工厂模式

private class User private constructor(val name: String) {
    companion object {
        fun newById(id: Int) = User(id.toString())
        fun newByDouble(double: Double) = User(double.toString())
    }
}
fun main() {
    //构造函数私有,无法创建
    //val user1 = User("leavesC")
    val user2 = User.newById(10)
    val user3 = User.newByDouble(1.3)
}

高阶函数

所谓的高阶函数就是:可以接受函数作为参数,也可以返回函数作为结果
**