kotlin 类型系统的设计哲学

首先有必要明确一下kotlin是如何自我标榜的:简洁,空指针安全,实用,和java,JavaScript的互操作性。

Nullability

由空指针引起的著名的百万美元bug,在java里面处理方式,是引用google的optional以及Lombok库的注解。但是不得不说,optional被滥用的代码比比皆是,lombok被滥用也会给代码的可维护性增添了不消负担。这个话题,可以重新开篇文章来讨论。kotlin把解决NPE的方案,nullability的支持,放在了语言的类型设计之中。

这里有个概念:platform type(平台类型)。java当中的一个变量既可以为null,也可以不为nonNull,他是不是空不可知,既有可能为空,也可能不为空,是一种空与非空状态的叠加,这不就是薛定谔状态吗?这对于kotlin来说就是paltform type。这把锅甩给了别的程序员,别人需要在代码当中添加很多的判空操逻辑,一个不可能为空的返回值,但如果client code使用其返回值,安全起见,要需要增加判空逻辑,null像霍乱一样被传播.....

kotlin将nullable的变量声明方式单独拿出来,致使那些不可能为null的变量(在声名的时候没有尾随一个‘?’)得到了解放,妈妈再也不用担心我没value了。

kotlin只有包装类型

下面说说数据类型,重要事情说三遍:kotlin只有包装类型x3。他为什么要这么做呢? primitive(直接存value)比reference type(存放value object地址)更有效率,在complie阶段,kotlin的reference 会被编译成primitive,除了范型参数。

Any类似于java Object。乏善可陈。

nothing&unit,但我还没有完全理解,后面再更。

Nothing 类型也是亮点。用来处理不会有返回值的函数,会帮助IDE告诉我们一些代码信息。比如哪些代码是unreachable。

可变与不可变,这是一个问题

effective java里面有条原则叫:让代码尽可能的不可变(Immutable)。java当中可以对变量添加final,对集合使用像guava和eclipse提供的库来完成。kotlin在这里多做了一步,把它放在了娘胎里。比如对于一个变量的声名在:val 和var。对于一个集合也有:Collection和MutableCollection。这对于减少代码side-effect和线程安全等话题来说,是有意义的。

让含混的东西变的更清晰,让暧昧不清的东西变的冷淡疏离,这就是kotlin正在做的事。

你可能感兴趣的:(kotlin 类型系统的设计哲学)