Kotlin变量声明和类型推断

892 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

本文来回顾一下 Kotlin 变量声明的方式,并与 Java中对比异同点,和类型推断的知识点。

本文大纲

Kotlin变量.png

来看一下 Java 局部变量声明的实例(成员变量的修饰符暂不讨论):

// 播放器的一些变量
boolean isPlaying = false;
final String songName = "七里香";
final ReadyForPlayingData readyForPlayingData = new ReadyForPlayingData();
WeakReference<OnProgressListener> onProgressListener = new WeakReference<>(this);
ResultData result = getPlayingResult();

以上基本涵盖了所有情况:基础类型,字符串,对象,范型,函数返回值接收。

下面看一下 Kotlin 版的写法:

// 播放器的一些变量
var isPlaying = false
val songName = "七里香"
val readyForPlayingData = ReadyForPlayingData();
var onProgressListener = WeakReference<OnProgressListener>(this);
var result = getPlayingResult()

初略统计,Java 需要 254 个字符,Kotlin 需要 189 个字符。在不考虑自动补全情况下,Kotlin 变量声明的效率比 Java 高 (254 - 189) / 189 = 34.3%。在打字速度理想情况下可以达到 150~200(字符/分钟),以这个为基准,在声明这段变量 Kotlin boyJava boy节省 20多秒

有兴趣可逛一下网站:livechatinc.com。点击 global-scores 可以看到全球人民的打字速度分布。

更高效率的代码编写可以提高开发效率

理清了 Kotlin 变量声明的优势后,一起来看里面的几个知识点:

1. 类型推断与 var

Kotlin 不再需要显式的声明变量的类型,取而代之的是通过赋值的类型来判断。编译器非常聪明,甚至可以把参杂多种类型的范型都能推断出来!但也有小部分情况需要显式声明,如:

  • 被赋值的类型不是期望的类型,如想声明为其父类;
  • 某些极限情况会出现无法推断的情形,如循环推断依赖

但的确是极小部分的情况,而且 IDE 都能给出相应提示。

声明变量使用 var / val 来代替原本的声明类型的地方。而需要声明类型的时候,在变量名后以“: Class”的形式声明,如:var abc: CharSequence = "abc"

新出现的编程语言基本都支持类型推断。从Java 8开始也支持了类型推断。

可参考:编程式语言历史

2. final 与 val

val 可以看做是 final var,不过 Kotlin 没有 final 这个关键字,只是代表的意义是这个意思。

为什么不要 final var,要val 这个也不是很清楚,或许就是更简洁。在 Java 中,其实也很少用final 这个关键字,虽然很多变量,类型和函数都符合 final 的设定。大部分变量我们只会设置一次,大部分的函数也不会被继承。那为什么不用上呢?唯一的原因就是因为打 final 太麻烦了!而 val 就是为了解决“final”打起来太麻烦而设计的

final 属性其实是一个很好用的代码约束,代表这个变量后面不会再被修改。如果是个 Java 成员变量,你甚至不需要担心被设置为 null。否则就要在很多地方加上非空判断。或者在首次维护一段代码的过程中,需要时刻考虑这个变量是否会被更改。

final修饰,意味变量的可能性变少,在阅读代码的过程中,不需要去关注这个变量的赋值变化,这对快速读懂代码是很有帮助的。更少的变化,意味着更清晰易懂的逻辑。

掘金(juejin.cn)  一起分享知识,Keep Learning!