当我们讨论Kotlin时,我们喜欢说它是一种专注于交互性的、实用的、精简的和安全的编程语言。我们说的每一个词的精确含义是什么呢?让我们来依次了解它们。

1.4.1 实用性

实用意味着对我们来说是简单的东西:Kotlin是一门为解决现实问题的实践性语言。它的设计是基于多年的大规模系统设计的行业经验。它的特性是被选中来解决许多软件开发者所遇到的案例。此外,JetBrains公司内部和社区的开发者已经使用了Kotlin早期版本许多年了。而且,他们的反馈已经在发行版中成型了。这让我们可以自信满满的说:Kotlin能够成功的帮助开发者解决真实项目中的问题。
 Kotlin也不是一门研究型语言。我们并非尝试着去提升编程语言设计的艺术境界,也不是在探索计算机科学中的创新构想。相反的,我们尽可能依靠那些已经出现在其他编程语言中并且被证明为成功的特性和解决方案。这降低了语言的复杂性。同时,通过让你沿用熟悉的概念会让语言变得易于上手。  同时,Kotlin并不强迫你使用任何特定的编程风格或范式。当你开始学习这门语言的时候,你能够使用你在Java开发经验中熟悉的风格和技术。随后,你将会慢慢的发现Kotlin中更强大的特性。学习并将它应用到你的代码中,把你的代码变得更加精简和符合Kotlin的语言习惯吧!
 Kotlin的实用主义的另一方面是它对工具的专注。对开发者的生产效率而言,一个智能的开发环境正如一门好语言那般重要。因此,把IDE支持作为一个后来添加的东西并不是一个可选项。就Kotlin来说,IntelliJ IDEA插件的开发紧跟跟编译器开发的步伐。在设计语言特性时,我们一直都考虑到了工具。
 在帮助你探索Kotlin特性的过程中,IDE支持也扮演了一个重要角色。在许多场合,工具将会自动检测能够被更加精简的构想所替代的共同的代码模式,并为你提供了代码填充功能。通过研究自动填充功能所使用的语言特性,你可以学习如何在你的代码中也应用这些特性。

1.4.2 精简

这是一个常识:开发者花费更多的时间在阅读既有代码上而不是编写新代码。想象一下你是一个大项目的开发团队的一员,你需要添加一个新的特性或者修复一个错误。你第一步会做什么呢?你会查找你需要修改的代码片段的位置。只有在这之后你才能实现修复。你读了许多代码来发现什么是你必须做的事。这份代码可能是由你的同事近期编写的或者是其他不再工作于这个项目的人编写的,又或者是你很久以前写的。只有理解了周边代码以后,你才能做出必要的修改。
 代码越简洁,你理解起来越快。当然了,良好的设计和富有表现力的命名也是非常重要的。但是编程语言的选择和它的简洁也同样重要。如果一门语言的语法清晰的表达了你所读代码的意图,并且它不是晦涩难懂,还带有八股代码来解释实现的意图,那么它就是简洁的。  在Kotlin中,我们尽力确保你编写的所有代码都是有意义的,而不仅仅是符合约定。大量的标准的Java八股代码,例如getter、setter和将构造器参数值赋给字段的逻辑,在Kotlin中都消失了,而且导致你的代码变得混乱。
 代码不必那么长的另一个原因是只需编写显示的代码来完成一般的任务,例如,定位一个集合中的一个元素。和许多其他现代语言一样,Kotlin拥有丰富的标准库。这些标准库能让你通过库函数调用来替代那些冗长、重复的代码段。Kotlin对lambda的支持使得传递一小块代码到库函数变得容易。这让你封装所有的通用部分到函数库,同时仅仅保留用户代码中独特的、业务相关的部分。 代码变得莫须有的冗长的另一个原因是,你必须编写显式的代码来执行通用的任务,例如,定位集合中的元素。就像许多其他现代语言那样,Kotlin拥有大量的标准库来让你使用库函数调用替代那些冗长、重复的代码片段。Kotlin对lambda的支持使得向库函数传递小段代码变得容易。这将允许你封装库中所有的通用部分。同时,你可以只保留用户代码中独特的,特定任务的部分。  与此同时,Kotlin不会尝试着去把源代码折叠成可能的最少字符。举个例子,尽管Kotlin支持操作符重载,但是用户不能够定义他们自己的操作符。因此,函数库开发者不能用含义模糊的标点符号序列来替代函数名。虽然单词稍微长了一些,但是通常来讲,单词比标点字符更容易阅读和在文档中查找。  代码越简洁,花在编写的时间就越少。更重要的是阅读的时间更少。而这将提升你的效率并让你把事情完成的更快。

1.4.3 安全

一般而言,当我们说一门编程语言安全时,我们是指它的设计阻止了程序中的某些错误。当然,这不是一个绝对的特性。没有一门编程语言能阻止所有可能的错误。另外,阻止错误往往要付出一些代价。你必须为编译器给出更多的关于程序预定操作的信息,以便编译器能够确认这些信息匹配到程序做了什么。就因为如此,你得到的安全级别和要求提供更多的详细的标注导致的生产效率的丢失之间一直都存在着矛盾。
 使用Kotlin,我们尝试着花费较小的代价来达到一个比Java更高级别的安全级别。运行在JVM已经提供了许多的安全性保证:举个例子,内存安全,防止了缓冲区溢出,还有其他动态内存分配的错误使用导致的其他问题。作为JVM平台的一门静态类型语言,Kotlin确保了你的应用的类型安全。这达到了比Java更小的消耗:你不需要指定所有的类型声明,因为在许多场景下编译器能够自动推断类型。
 Kotlin也能够超越Java。这意味着通过编译时检查而不是在运行时失败可以阻止更多的错误。最重要的是,Kotlin努从你的程序中移除NullPointerException。Kotlin的类型系统跟踪能或者不能为空的值,并且禁止了在运行时导致NullPointerExcepption异常的操作。它需要的额外成本是最小的:标记为一个可为空的类型只需要一个单独的字符,在末尾加一个问号:

val s: String? = null    // 1 可能为空
val s2: String = ""      // 2 一定不为空

另外,Kotlin提供了许多便捷的方式来处理可为空的数据。这在消除应用崩溃方面有着极大的帮助。
 Kotlin有助于避免的另一种异常是ClassCastException。当你抛出一个对象为一种类型但没有初次检查它的类型是否正确时,这种异常就会发生。
 在Java编程界,开发者经常遗漏了检查,因为类型名称在检查和接下来的转换中会重复。另一方面,在Kotlin中,检查和转型被合并为一个单独的操作:一旦你检查了类型,你就可以应用该类型的成员而无需额外的类型转换。因此,Kotlin中没有理由跳过检查,也没有机会出错。下面是工作原理展示:

if (value is String)              // 1 类型检查
  println(value.toUpperCase())    // 2 调用该类型的方法

1.4.4 互操作性

考虑到互操作性,你的第一反应可能是:“我能够使用我已有的库吗?”。使用Kotlin,答案是:“是的,一定可以!”。不管函数库要求你使用的API种类,你可以在Kotlin中使用它们。你可以调用Java方法,扩展Java类和实现接口以及为你的Kotlin类应用Java标注等等。
 不同于其他的JVM语言,Kotlin在互操作性方面走得更远,也使得你毫不费力的从Java代码中调用Kotlin代码。这并不需要什么技巧:Kotlin类和方法能够像常规的Java类和方法那样被调用。这将给你带来在项目的任何地方混合Java和Kotlin代码的终极灵活性。当你开始在你的Java项目中采用Kotlin时,你可以在你的代码库中的任意单一文件中运行Java-Kotlin转换器,其余的代码将会继续编译和正常工作而无需任何修改。不管你所转换的类是什么角色,这个功能都有效。
 Kotlin专注于互操作性的另一个方面是尽最大可能的使用现有的Java库。例如,Kotlin并没有自己的集合库。它依赖于Java标准库的类,通过额外的函数来扩展他们以更加方便的使用Kotlin(我们将会在XREF ID_xx 扩展函数章节讨论这个机制)。这意味着当你调用Java API时,你不需要通过Kotlin包装或者转换对象。Kotlin提供的所有API都不会出现运行时消耗。
 Kotlin工具也为多语言项目提供了全面的支持。它能够编译任意一个混合Java和Kotlin的源文件,不论他们之间是如何的相互依赖。这个IDE特性对其他语言也是有效的。它将允许你做以下事情:

  • 在Java和Kotlin源文件中自由切换
  • 调试混合语言项目并在用不同语言编写的代码中单步跟踪
  • 使用Kotlin重构和正确的升级你的Java函数,反之亦然

幸好,到目前为止我们已经说服你尝试Kotlin。现在,你该如何入门呢?在接下来的环节,我们将会讨论从命令行和使用不同工具编译和运行Kotlin代码的步骤。

results matching ""

    No results matching ""