为什么我们建议尝试一下新颖简洁的现代语言Kotlin

开发 后端
由于最近在客户项目上有机会使用了Kotlin这门今年大热的语言,所以在好几个不同的场合都被要求做一些Kotlin相关的分享,在这个过程中被问到的最多的一个问题便是——我们为什么要尝试Kotlin?
  • 对Android的***支持为迅速发展的Kotlin语言提供了额外的推动力,我们也正在密切关注Kotlin / Native(基于LLVM,可以将Kotlin代码编译为原生可执行文件)的进展。在使用Anko库开发Android应用时,我们已经尝到了空指针安全、数据类和易于构建DSL的甜头。尽管初始编译速度慢,且只有IntelliJ才提供***的IDE支持,但我们仍然建议尝试一下这种新颖简洁的现代语言。

由于最近在客户项目上有机会使用了Kotlin这门今年大热的语言,所以在好几个不同的场合都被要求做一些Kotlin相关的分享,在这个过程中被问到的最多的一个问题便是——我们为什么要尝试Kotlin?

 

[[219942]]
(图片来自:http://suo.im/4hXHdp)

实际上客户早在去年年初的时候便已经完成了他们的后端技术选型,而Kotlin在那个时候便已经成为了项目构建后端微服务的主要语言。所以在这些分享中我并没能给出一个很好的答案,而这个问题本身也引起了我的思考。

首先我们看看Kotlin语言的特点,官方罗列了4个显著的特点:

  • 简洁 Consice
  • 安全 Safe
  • 友好的开发工具 Tool-friendly
  • 和Java的互操作性 Interoperable

简洁 Concise

Kotlin的简洁体现在很多方面,对于Java程序员来说,最直接的体现便是在Kotlin语法中直接省略了分号,并且在构造一个类的实例时省略了new关键字,下面便是一段标准的Kotlin代码:

 

  1. fun sayHi(name: String): String { 
  2.     val sb = StringBuilder(str = "Hi "
  3.     sb.append(name
  4.     return sb.toString() 

让我们再看一个Kotlin官网的示例代码,来体会一下Kotlin的简洁:

  1. data class Customer(val name: String, val email: String, val company: String) 

简单的一行代码便实现了一个包含了constructor以及默认getters, toString, equals, hashCode和copy实现的Pojo,而同样的java实现需要大概50多行代码, 即便是在Lombok的帮助下仍然需要十几行代码。

Kotlin还在Java集合类的基础上进行了封装,并提供了非常丰富的集合操作。同时结合非常简洁的Lambda表达式,使得调用更加精简。

 

  1. val numbers = 1..10 
  2. val doubles = numbers.map {it * 2} 
  3. val sumOfSquares = doubles.fold(0) {x,y -> x+y} 

除了这些,Kotlin还提供了很多类似字符串模板、标准函数库、运算符重载的特性,这些特性使得代码可以非常简洁易读,极大提升了开发者的体验。

从实际项目来看,Kotlin的简洁在代码量上表现的非常明显,一个提供了24个API的Spring Boot微服务,通过Kotlin编写的代码量在8000行左右(含测试代码)。同样规模的微服务用Java编写的情况下代码量将远大于这个数字。

安全 Safe

许多编程语言(包括 Java)中最常见的陷阱之一是访问空的指针,导致空指针异常。Kotlin的安全性主要体现在它对Null-Safety的支持上。能够使代码在编译期间就察觉到可能的NullPointerException,让Java developer能够轻松摆脱NullPointerException。

 

  1. var output: String 
  2. output = null // Compilation error 
  3.  
  4. val name: String? = null // Nullable type 
  5. println(name.length()) // Compilation error 

同时Kotlin还提供了一些自动转型及类型推断的特性,在提供安全检查的同时也带来了便捷。

下面也是一个来自官网的样例,Kotlin在类型检查得到true后,自动完成了Any到Invoice类型的转换:

 

  1. fun calculateTotal(obj: Any) { 
  2.     if (obj is Invoice) 
  3.         obj.calculateTotal() 

友好的开发工具 Tool-friendly

这个特点就不用多说了,引用官网那句傲娇的原话就是 “It’s what we do best!”

和Java的互操作性 Interoperable

简单来说这个特性就是Kotlin和Java是可以相互调用的。

这意味着我们可以利用任何已有的Java libraries来构建我们的应用,让我们无需放弃我们所熟悉的一切便可以享受Kotlin给我们带来的愉快的编程体验。

 

  1. ... 
  2. import org.springframework.data.jpa.repository.JpaRepository 
  3. import org.springframework.data.jpa.repository.JpaSpecificationExecutor 
  4. ... 
  5.  
  6. interface AreaRepository : JpaRepository<AreaEntity, Long>, JpaSpecificationExecutor<AreaEntity> { 
  7.     fun existsByAreaId(id: UUID): Boolean 
  8.     fun findOneByAreaId(areaId: UUID): AreaEntity? 

例子中是项目上一个用Kotlin编写的基于Spring JPA的Repository,可以看到得益于Interoperable的特性,在尝试使用Kotlin时我们可以依赖的是一个完整的Java生态圈。我们依然可以使用我们所熟悉的框架、构建工具、开发工具和测试工具。

 

[[219943]]

如何开始?

看了这么吸引人的语言特性,或许你已经忍不住想要尝试Kotlin了。但是实际情况可能是项目已经开始了一段时间,我们已经用Java为项目构建了很多功能。这个时候引入一个新的语言可能会给项目带来一定的风险。那么我们可以如何开始呢?

使用Kotlin编写单元测试

如果你比较保守,那么你可以开始尝试在项目中仅通过Kotlin来编写单元测试,同样得益于Interoperable这个特性,我们可以轻松的使用Kotlin来为Java类编写单元测试。这样你可以不用担心尝试Kotlin为你的业务代码带来风险,同时也可以在编写单元测试的过程中尝试Kotlin语言的各种特性。

使用Kotlin来扩展

你还可以使用Kotlin来丰富项目中所用到的Library,使用Kotlin Extensions来在不需要继承的情况下完成对原有类型的扩展。或者直接通过Kotlin来编写工具类为项目服务。

 

  1. //Extensions.kt 
  2. fun String.lastChar() = this.get(this.length - 1) 
  3. fun KPerson.fullName() = "${this.firstName} ${this.lastName}" //String template 
  4.  
  5. //Java JUnit test 
  6. Test 
  7. public void lastChar() throws Exception { 
  8.  assertEquals('n', Extensions.lastChar("Kotlin")); 
  9.  
  10. Test 
  11. public void fullName() throws Exception { 
  12.   KPerson k = new KPerson("Foo""Bar", Gender.MALE, 18); 
  13.   assertEquals("Foo Bar", Extensions.fullName(k)); 

使用Kotlin来重写微服务

如果你在使用基于Spring Boot的微服务,那么完全可以挑选一个优先级较低的服务逐步通过Kotlin进行改写。你会发现这个转变会发生的无比顺滑。因为Kotlin不会改变你之前通过Spring Boot构建微服务的方式。

这三个方法都可以让你在风险可控的情况下尝试Kotlin。让你在感受Kotlin语言带来的美好编程体验的同时,使整个团队逐渐熟悉Kotlin语言。你将会发现对于一个Java程序员来说,学习Kotlin真的是一件非常容易的事情,可以说一旦开始你就再也回不去了。

技术雷达

正在我们还在犹豫是否要尝试Kotlin的时候,***一期技术雷达上Kotlin的表现又给了我们一个难以抗拒Kotlin的理由。虽然在雷达的描述中,我们更关注的是Kotlin在Android Native领域的影响力,但是随着Spring社区对Kotlin的支持和更过成功项目的出现,相信Kotlin会继续向雷达的圆心迈进。

责任编辑:未丽燕 来源: 程序师
相关推荐

2020-10-15 11:18:13

Linux内核虚拟机

2022-08-08 10:09:08

Vitest单元测试

2021-01-21 07:31:11

Filter框架权限

2016-08-22 13:31:05

前端架构前后端分离

2010-12-06 09:10:02

LightSwitch

2022-03-02 10:53:22

Postman工具开发

2022-06-29 10:04:01

PiniaVuex

2022-12-03 18:24:13

数据能力场景

2023-02-08 09:02:05

VS Code摸鱼神器

2018-05-30 14:49:51

编程语言API语法

2010-11-03 09:22:00

C语言

2016-09-27 21:25:08

Go语言Ken Thompso

2022-12-12 07:30:59

编程语言架构

2013-11-20 13:41:32

IE微软解决方法

2017-07-14 14:12:10

AndroidRecyclerVie

2021-04-27 07:52:18

SQLNULLOR

2021-08-09 09:39:59

Docker部署镜像

2018-03-24 21:11:17

AI智慧城市交通

2012-04-11 09:19:08

Haskell编程

2016-11-24 17:21:30

点赞
收藏

51CTO技术栈公众号