2. 变量声明与类型推断

本文介绍 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

发表评论

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据