这个坑我都说了很多遍了,怎么还有人踩?Kotlin可能带来的一个深坑(最后一次提醒)

  • Post author:
  • Post category:其他




写在前面

去年,哦不,前年五月的时候,谷歌宣布了Kotlin-First 这一重要概念,主张Kotlin 是 Android 开发者的首选语言。

消息发出去后,很多人心中都有了一个疑问:那我一个搞Android开发的,我现在是不是以后就只用学Kotlin 就可以了?

一般有这个疑问或者想法的人都是外行人或者说是入行不久的人。

今天在这里就分享一个行业大佬的看法吧,本文也可以当做移动开发新手手册。希望本文对大家有帮助。

来自公众号:承香墨影


本文内容:

  • Kotlin可能带来的坑
  • 分析总结
  • 移动开发学习



Kotlin可能带来的坑



一. 前言

新语言有新特性,开发者还保持 Java 的编程习惯去写 Kotlin,也不是不行,但是总感觉差点意思。

最近公众号「谷歌开发者」连载了一个《实用 Kotlin 构建 Android 应用 | Kotlin 迁移指南》的系列文章,就举例了一些 Kotlin 编码的小技巧。

既然是一种指南性质的文章,自然在「多而广」的基础上,有意去省略一些细节,同时举例的场景,可能还有一些不恰当的地方。

这里我就来补齐这些细节,今天聊聊利用 Kotlin 的方法默认参数的特性,完成类似 Java 的方法重载的效果。完全解析这个特性的使用方式和原理,以及在使用过程中的一个深坑。



二. Kotlin 的简易方法重载



2.1 Kotlin 如何简化方法重载?

在 Java 中,我们可以在同一个类中,定义多个同名的方法,只需要保证每个方法具有不同的参数类型或参数个数,这就是 Java 的

方法重载

class Hello {
    public static void hello() {
        System.out.println("Hello, world!");
    }

    public static void hello(String name) {
        System.out.println("Hello, "+ name +"!");
    }

    public static void hello(String name, int age) {
        if (age > 0) {
            System.out.println("Hello, "+ name + "(" +age +")!");
        } else {
            System.out.println("Hello, "+ name +"!");
        }
    }
}

在这个例子中,我们定义了三个同名的

hello()

方法,具有不同的逻辑细节。

在 Kotlin 中,因为它支持在同一个方法里,通过 「

?

」标出可空参数,以及通过「

=

」给出参数的默认值。那这三个方法就可以在 Kotlin 中,被柔和成一个方法。

object HelloDemo{
    fun hello(name: String = "world", age: Int = 0) {
        if (age > 0) {
            System.out.println("Hello, ${name}(${age})!");
        } else {
            System.out.println("Hello, ${name}!");
        }
    }
}

在 Kotlin 类中调用,和前面 Java 实现的效果是一致的。

HelloDemo.hello()
HelloDemo.hello("承香墨影")
HelloDemo.hello("承香墨影", 16)

但是这个通过 Kotlin 方法参数默认值的特性申明的方法,在 Java 类中使用时,就有些区别了。因为 HelloDemo 类被声明为 object,所以在 Java 中需要使用

INSTANCE

来调用它的方法。

HelloDemo.INSTANCE.hello("承香墨影",16);

Kotlin 中调用

hello()

方法很方便,可以选择性的忽略参数,但是在 Java 中使用,必须全量的显式的去做参数赋值。

这就是使用了参数默认值的方法申明时,分别在 Kotlin 和 Java 中的使用方式,接下来我们看看原理。



2.2 Kotlin 方法参数指定默认值的原理

Kotlin 编写的代码,之所以可以在 Java 系的虚拟机中运行,主要是因为它在编译的过程中,会被编译成虚拟机可识别的 Java 字节码。所以我们通过两次转换的方式(Show Kotlin Bytecode + Decompile),就可以得到 Kotlin 生成的对应 Java 代码了。



版权声明:本文为BUGgogogo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。