Kotlin定义静态方法和静态变量

Kotlin定义静态方法和静态变量

静态方法

静态方法在某些编程语言里又叫做类方法,指的就是那些不需要创建实例就可以调用的方法,所有主流的变成语言都会支持静态方法这个特性。

在Java中定义静态方法非常简单,只需要在方法上声明一个static关键字就可以了。

public class Util {
    public static void doAction() {
        System.out.println("do action");
    }
}

这是一个非常简单的工具类,上述代码中的doAction方法是一个静态方法。调用静态方法不需要创建类的实例,而是直接以Util.doAction()这种方式来调用。

因而静态方法非常适合编写一些工具类的功能,因为工具类通常没有创建实例的必要,基本是全局通用的。

然而,Kotlin却极度弱化了静态方法这个概念。(因为Kotlin已经提供了单例类这个语法特性)

Kotlin中使用单例类实现静态方法

如果使用Kotlin,上面的方法可以这么写:

object Util {
    //doAction的调用方式与java静态方法相同
    fun doAction() {
        println("do Action")
    }
}

虽然这里的doAction()不是静态方法,但是我们仍然可以用Util.doAction()的方式来调用,这就是单例类带来的便利性。

单例类中的所有方法都是类似与静态方法。如果只是需要类中的某个方法变成静态方法,该怎么办呢?

Kotlin中使用伴生对象实现静态方法

使用伴生对象实现静态方法方式如下:

class Util {
    fun doAction1() {
        println("do action1")
    }
    //doAction2()的调用方式与java静态方法相同
    companion object {
        fun doAction2() {
            println("do action2")
        }
    }
}

首先这里Util从单例类变成了普通类,然后在类中直接定义了一个doAction1()方法,又在companion object中定义了一个doAction2()方法。 现在这两个方法就有了本质的区别,因为doAction1()方法一定要先创建Util类的实例才能使用,而doAction2()方法可以直接使用Util.doAction2()的方式调用。

注意:doAction2()也不是静态方法, companion object 这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2()就是定义在这个伴生类的实例的方法。只是Kotlin会保证Util类始终指挥存在一个伴生类对象,因此调用Util.doAction2()方法实际上就是调用了Util中伴生对象的doAction2()方法。

以上两种方式都不是直接定义静态方法。如果确确实实需要定义真正的静态方法,Kotlin也提供了两种方法:注解和顶层方法。

Kotlin中用注解编译成真正的静态方法

前面使用的单例类和companion object都只是在语法的形式上模仿了静态方法的调用方式,实际上它们都不是真正的静态方法。 如果在Java代码中以静态方法的形式去调用的话,你会发现这些方法不存在。

而如果我们给单例类或者companion object中的方法加上@JvmStatic注解,那么Kotlin编译器就会将这些方法编译成真正的静态方法,如下所示:

class Util {
    fun doAction1() {
        println("do action1")
    }
    //doAction2()的调用方式与java静态方法相同
    @JvmStatic
    companion object {
        fun doAction2() {
            println("do action2")
        }
    }
}

注意:@JvmStatic只能加在单例类或者companion object中的方法上,如果尝试加在一个普通方法上,就会提示语法错误。

由于doAction2()已经成为了一个真正的静态方法,那么现在不管是在Kotlin中还是在Java中都可以使用Util.doAction2()调用了。

Kotlin中编写顶层方法实现真正的静态方法

顶层方法是指那些没有定义在任何类汇总的方法。比如我们编写的main()方法。

Kotlin编译器会将所有的顶层方法全部编译成静态方法,因此只要你定义了一个顶层方法,那它一定是静态方法。

想要定义一个顶层方法,首先需要创建一个Kotlin文件(不是class或object),创建完成后是一个Xxx.kotlin文件。现在我们在这个文件中定义的方法都是顶层方法。

比如定义一个顶层方法

fun doAction () {
    println("do Action")
}

如果是在Kotlin中调用的话,所有的顶层方法都可以在任何位置被直接调用,不用管包名路径,也不用创建实例。

如果是在Java中调用的话,需要通过Xxx.doAction()的方式调用。因为Java没有顶层函数的概念,所有的方法必须定义在类中。刚才创建的Kotlin文件,Kotlin编译器会自动创建一个同名的Java类。

Kotlin中的静态变量

静态变量(全局变量)

Java中的静态变量,定义在类中,并以static修饰。如下

public class Util {
    public static int status = 0;
}

如果在Kotlin中要实现类似变量,应该可以采用上面静态方法章节同样的方法(我猜的)。我暂时只试过companion object方式。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注