Kotlin 基本使用之方法 | 青训营笔记

42 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的第 2 天。

在这次组队大项目中,我初次了解到了 Kotlin 这门新兴语言。为了能使本项目顺利开展,我也对这门语言进行了一定的学习。接下来我将会写一些我对这门语言的理解。

方法

方法相当于函数,本章均用方法代替函数。

Java

Java 的方法都比较普通,和其他语言相比,算是没有什么亮点的一种,它可以简单的分为静态方法和非静态方法,比如:

// 静态方法
public static void foo() {
    doSomething();
}
​
// 非静态方法
public void bar() {
    doSomething();
}

Java 的方法规定必须在类里,不能脱离类来使用。而且,Java 不支持很多特性,导致有时候不能很优雅的进行一些行为。

比如说,你要实现 dp 与 px 的转换,通常会写出这样的方法:

public class Utils {
    public static int dp2px(int dp) {
        return px;
    }
}

当你有一个 dp 值(= 114514)时,你会写出这样的代码实现转换:

Utils.dp2px(114514)

虽然说这样做没有任何错误,但看起来总是觉得不美观,要是直接114514.dp能实现转换就好了,可惜 Java 暂时不支持拓展函数的写法。你无法拓展 Integer 的方法,对于 Java 来说,它就是定死的。

再比如说,我们都知道在 Java 里,Array 和 List 有一个很大的区别就是在获取元素的时候前者用[],后者用get(int)。很多人刚学 Java 的时候都会有这样的疑问,为什么不统一起来都是[]呢?很大一个原因就是 Java 不支持运算符重载,Java 无法把get(int)识别成类似 Array 的 []。还有就是 BigInteger 那个算大数的类,加减乘除必须用链式调用方法,而不能和一般数字一样使用符号,这也是不能运算符重载造成的问题。

除此之外,Java 还有很多不是很尽善尽美的地方。

Kotlin

Kotlin 相比 Java 那可是玩得花了。Java 有的它都有,没有的它也有。

接下来我会写一个集大成的 kt 文件,再写一个由该 kt 文件反编译后的 Java 文件,来介绍一下 kotlin 的各种方法。

fun a(): Int {
    return 1
}
​
class Test {
    companion object {
        fun b(): Int {
            return 1
        }
        
        @JvmStatic
        fun c(): Int {
            return 1
        }
    }
    
    fun d(): Int {
        return 1
    }
    
    operator fun plus(test: Test): Test {
        return Test()
    }
}

你一看,我 static 呢,怎么没了?怎么类外面还会有方法?别急,看看这个代码对应的 Java 代码:

public class Test {
    
    public static final Test.Companion Companion = new Test.Companion(null);
    
    @JvmStatic
    public final static int c() {
        return 1;
    }
    
    public final int d() {
        return 1;
    }
    
    public final Test plus(@NotNull Test test) {
        Intrinsics.checkNotNullParameter(test, "test");
        return new Test();
    }
    
    public static final class Companion {
      public final int b() {
         return 1;
      }
​
      @JvmStatic
      public final int c() {
         return 1;
      }
​
      private Companion() {
      }
​
      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}
​
public class TestKt {
    public final static int a() {
        return 1;
    }
}

它们的区别在反编译文件中写的很详细。那个plus方法就是运算符重载,你就可以用符号来代替链式调用了。

总结

相比 Java,Kotlin 明显有更大的灵活性。值得 Android 开发者进行深入学习。