使用Kotlin的一些优点

去年的Google I/O 2017 Keynote上, 谷歌宣布将Kotlin语言作为安卓开发官方编程语言,Kotlin是JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。本文讲讲使用Kotlin可以给我们带来的好处。

一、简洁

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

fun sayHi(name: String): String {
    val sb = StringBuilder(str = "Hellow")
    sb.append(name)
    return sb.toString()
}

再看一个Kotlin官网的示例代码,感受一下Kotlin的简洁:

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

使用java实现需要大概50多行代码, 而Kotlin简单的一行代码便实现了一个包含了constructor以及默认getters, toString, equals, hashCode和copy实现的Pojo。

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

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

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

二、安全

在Java和许多编程语言中常常出现访问空的指针,导致空指针异常。Kotlin的安全性主要体现在它对Null-Safety的支持上。能够使代码在编译期间就察觉到NullPointerException,让Java developer能够轻松避免NullPointerException。

var output: String
output = null // Compilation error

val name: String? = null // Nullable type
println(name.length()) // Compilation error

为了提供安全检查的同时的便捷,Kotlin提供了一些类型推断和自动转型的特性。

下面是一个官网上的样例,Kotlin在类型检查为true时,可以自动完成Any变成Invoice类型的转换:

fun calculateTotal(obj: Any) {
    if (obj is Invoice)
        obj.calculateTotal()
}

三、Kotlin和Java是可以相互调用的。

我们可以利用任何已有的Java libraries来构建我们的应用,可以使用之前熟悉的Java经验。

...
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor
...

interface AreaRepository : JpaRepository, JpaSpecificationExecutor {
    fun existsByAreaId(id: UUID): Boolean
    fun findOneByAreaId(areaId: UUID): AreaEntity?
}

上面例子中是用Kotlin编写基于Spring JPA的Repository,因为Kotlin和Java是可以相互调用的,在使用Kotlin时我们同时可以应用一个完整的Java生态圈。可以用之前所熟悉的框架、构建工具、开发工具和测试工具。

如果你的项目已经开始了,我们可以先使用Kotlin编写单元测试

这样你可以不用担心尝试Kotlin给你的项目代码带来风险,同时也可以在编写单元测试的过程中尝试Kotlin语言的各种特性。

或者可以使用Kotlin来扩展

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

//Extensions.kt
fun String.lastChar() = this.get(this.length - 1)
fun KPerson.fullName() = "${this.firstName} ${this.lastName}" //String template

//Java JUnit test
Test
public void lastChar() throws Exception {
 assertEquals('n', Extensions.lastChar("Kotlin"));
}

Test
public void fullName() throws Exception {
  KPerson k = new KPerson("Foo", "Bar", Gender.MALE, 18);
  assertEquals("Foo Bar", Extensions.fullName(k));
}

又或者可以使用Kotlin来重写微服务

比如你在用基于Spring Boot的微服务,可以选一个比较不重要的服务逐步通过Kotlin进行改写。改写很顺畅,不会改变你之前通过Spring Boot构建微服务的方式。

以上几种方法都可以让你开始尝试Kotlin。

你可能感兴趣的:(使用Kotlin的一些优点)