2. 变量声明与类型推断
- 2020 年 2 月 11 日
- 笔记
本文介绍 Kotlin 变量声明涉及的相关知识点。首先我们来回顾一下 Java 局部变量声明的几个例子(成员变量的修饰符先不讨论):
// 播放器的一些变量 boolean isPlaying = false; final String songName = "Dingdingdong"; final ReadyForPlayingData readyForPlayingData = new ReadyForPlayingData(); WeakReference onProgressListener = new WeakReference<>(this); ResultData result = getPlayingResult();
以上基本涵盖了所有情况:基础类型,字符串,对象,范型,函数返回值接收。接下来我们看 Kotlin 是怎么声明的:
// 播放器的一些变量 var isPlaying = false val songName = "Dingdingdong" val readyForPlayingData = ReadyForPlayingData(); var onProgressListener = WeakReference(this); var result = getPlayingResult()
微微统计一下,Java 需要打 263 个字符,Kotlin 需要打 198 个字符。不考虑自动补全帮助的话,Kotlin 变量声明的效率比 Java 高 (263 – 198) / 198 = 33%。一般程序员打字速度在理想(思维行云流水)情况下可以去到 150~200 CPM (字符/分钟),这意味者在声明这段变量 Kotlin boy 比 Java boy 能节省 20~26 秒。
感兴趣的同学试试这个网站:livechatinc.com。点击 global-scores 还可以看到全球人民的速度分布。 我是 232 CPM,53 WPM。考虑到编程需要输入大小写和标点,实际会慢不少。 玩完记得回来。。
更高效率的代码编写可以提高你的开发效率。诚然有很多二指禅的大神,但当你思路确定,需要快速的编写出来的一段小代码并调试的时候,这种效率的优势是实实在在的,特别在变量声明这种低思考密度的代码上。这也是现代语言的威力。
那么理清了 Kotlin 变量声明带给我们的好处后,我们一起来看一下里面的几个知识点:
1. 类型推断与 var
Kotlin 不再需要显式的声明变量的类型,取而代之的是通过赋值的类型来判断。事实证明,绝大部分情况都是 work 的。而且编译器非常聪明,甚至连参杂了多种类型的范型都能推断出来!极小部分情况需要显式声明,如:
- 被赋值的类型不是期望的类型,如想声明为其父类
- 某些极限情况会出现无法推断的情形,如循环推断依赖
但确实是极小部分的情况,而且 IDE 都能给出解决办法。
声明变量使用 var / val 来代替原本的声明类型的地方。而需要声明类型的时候,在变量名后以“: Class”的形式声明,如:var abc: CharSequence = "abc"
。
2000 年后出现的编程语言基本都支持类型推断了。连 Java 8 也开始支持类型推断。 可参考:程式语言历史
2. final 与 val
val = final var,不过 Kotlin 没有 final 这个关键字,只是代表的意义是这个意思。这个知识点已经讲完了,再见!
开个玩笑,我们还是需要知道为什么不要 final var,要val。在 Java 年代,我们很少用 final 这个关键字,虽然很多变量,类型和函数都符合 final 的设定。大部分变量我们只会设置一次,大部分的函数也不会被继承。那为什么不用上呢?唯一的原因就是因为打 final 太麻烦了!而 val 就是为了解决“final”打起来太麻烦而设计的。
final 属性其实是一个很好用的代码约束,他代表这个变量后面不会再被修改。如果是个 Java 成员变量,你甚至不需要他被担心设置为 null。否则你就要在很多地方加上非空判断。或者在首次维护一段别人代码的过程中,需要时刻考虑这个变量是否会被更改。
final 意味这这个变量的可能性变少了,我们在阅读代码的过程中,不需要再去关注这个变量的赋值变化,这对我们快速读懂代码是很有帮助的,毕竟我们脑容量都是有限的,并不能同时关注非常多的变化。更少的变化,意味着更清晰易懂的逻辑。
Swift 是 var 和 let。
版权所有,转载请注明出处: https://sickworm.com/?p=1774