当前位置: 首页 > 科技观察

为什么我们推荐尝试全新简洁的现代语言Kotlin

时间:2023-03-13 17:33:58 科技观察

对Android的最新支持为快速发展的Kotlin语言提供了额外的动力,同时我们也在密切关注Kotlin/Native(基于LLVM,Kotlin代码可以是编译为本机可执行文件)。在使用Anko库开发Android应用的时候,我们尝到了空指针安全、数据类和DSL轻松构建的甜头。尽管初始编译速度较慢且仅在IntelliJ中提供最好的IDE支持,但我们仍然建议尝试使用这种清新干净的现代语言。由于最近有机会在一个客户项目中使用到今年流行的语言Kotlin,所以在不同的场合都被要求分享一些Kotlin相关的资料。在这个过程中被问得最多的一个问题是——为什么要尝试Kotlin?(图片来自:http://suo.im/4hXHdp)其实早在去年年初,客户就已经完成了后端技术选型,Kotlin已经成为项目的主要语言构建后端微服务。所以在这些分享中,我并没有给出很好的答案,问题本身就引发了我的思考。首先我们来看一下Kotlin语言的特点。官方列表有4个显着特点:ConciseConsiceSafeSafeFriendly开发工具Tool-friendlyInteroperablewithJavaInteroperableConciseConciseKotlin的简单性体现在很多方面。对于Java程序员来说,最直接的表现就是在Kotlin语法中直接省略了分号,在构造类的实例时省略了new关键字。下面是一段标准的Kotlin代码:funsayHi(name:String):String{valsb=StringBuilder(str="Hi")sb.append(name)returnsb.toString()}我们再看一个Kotlin官网的示例代码来体验Kotlin的简单性:dataclassCustomer(valname:String,valemail:String,valcompany:String)一行简单的代码实现了一个Pojo,其中包括构造函数和默认getter、toString、equals、hashCode和复制实现,而同样的java实现需要大约50行代码,即使借助Lombok也需要十几行代码。Kotlin也是在Java集合类的基础上进行了封装,提供了非常丰富的集合操作。同时结合非常简洁的Lambda表达式,让调用更加精简。valnumbers=1..10valdoubles=numbers.map{it*2}valsumOfSquares=doubles.fold(0){x,y->x+y}除了这些,Kotlin还提供了很多类似的字符串模板,标准函数库,运算符重载的特点使得代码非常简洁易读,大大提升了开发者的体验。从实际项目来看,Kotlin的简洁性在代码量上是非常明显的。对于一个提供24个API的SpringBoot微服务,用Kotlin编写的代码量大约8000行(包括测试代码)。同样规模的微服务用Java编写时,代码量会远大于这个数字。许多编程语言(包括Java)中最常见的陷阱之一是访问空指针,导致空指针异常。Kotlin的安全性主要体现在对Null-Safety的支持上。它可以让代码在编译过程中意识到可能的NullPointerException,从而使Java开发人员可以轻松摆脱NullPointerException。varoutput:Stringoutput=null//Compilationerrorvalname:String?=null//Nullabletypeprintln(name.length())//Compilationerror同时,Kotlin也提供了一些自动转换和类型推断的特性,这也带来了安全检查的方便。下面也是官网的样例。类型检查为真后,Kotlin自动完成Any到Invoice类型的转换:funcalculateTotal(obj:Any){if(objisInvoice)obj.calculateTotal()}友好的开发工具Tool-友好的功能不用说了,原来官方网站的引述是“这是我们最擅长的!”和Java的互操作性。简单来说,这个特性就是Kotlin和Java可以互相调用。这意味着我们可以使用任何现有的Java库来构建我们的应用程序,让我们可以享受Kotlin带来的愉快的编程体验,而无需放弃我们熟悉的一切。...importorg.springframework.data.jpa.repository.JpaRepositoryimportorg.springframework.data.jpa.repository.JpaSpecificationExecutor...interfaceAreaRepository:JpaRepository,JpaSpecificationExecutor{funexistsByByAreaId(id:UUID):布尔区域Id:UUID):AreaEntity?}示例是项目中使用Kotlin编写的基于SpringJPA的存储库。我们可以看到,得益于Interoperable特性,我们在尝试使用Kotlin时可以依赖的是一个完整的Java生态系统。.我们仍然可以使用我们熟悉的框架、构建工具、开发工具和测试工具。如何开始?看到如此吸引人的语言特性后,也许你会忍不住想要尝试一下Kotlin。但实际情况可能是项目已经启动了一段时间,我们已经用Java为项目构建了很多功能。这个时候引入新的语言可能会给项目带来一定的风险。那么我们如何开始呢?使用Kotlin编写单元测试如果你比较保守,那么你可以开始尝试在项目中只通过Kotlin编写单元测试。同样得益于Interoperable特性,我们可以轻松地使用KotlinforJavaClass编写单元测试。这样你就不用担心尝试Kotlin会给你的业务代码带来风险,而且在编写单元测试的过程中也可以尝试Kotlin语言的各种特性。使用Kotlin进行扩展你也可以使用Kotlin丰富项目中使用的Library,使用KotlinExtensions完成对原有类型的扩展,无需继承。或者直接使用Kotlin编写工具类来为项目服务。//Extensions.ktfunString.lastChar()=this.get(this.length-1)funKPerson.fullName()="${this.firstName}${this.lastName}"//Stringtemplate//JavaJUnittestTestpublicvoidlastChar()throwsException{assertEquals('n',Extensions.lastChar("Kotlin"));}TestpublicvoidfullName()throwsException{KPersonk=newKPerson("Foo","Bar",Gender.MALE,18);assertEquals("FooBar",Extensions.fullName(k));}使用Kotlin重写微服务如果你正在使用基于SpringBoot的微服务,你可以选择一个优先级较低的服务,通过Kotlin逐步重写。你会发现这种转变会非常顺利地发生。因为Kotlin不会改变您使用SpringBoot构建微服务的方式。这三种方法都允许您以可控的风险尝试Kotlin。让你体验Kotlin语言带来的美好编程体验,让整个团队逐渐熟悉Kotlin语言。你会发现,对于一个Java程序员来说,学习Kotlin真的是一件非常容易的事情,可以说一旦开始,就再也回不去了。技术雷达当我们还在犹豫要不要尝试Kotlin时,Kotlin在最新技术雷达上的表现给了我们抵制Kotlin的另一个理由。虽然在雷达的描述中,我们更关注Kotlin在AndroidNative领域的影响,但是随着Spring社区对Kotlin的支持以及更多成功项目的出现,相信Kotlin会继续前行朝向雷达的中心。