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

使用Kotlin开发一个月后的感想

时间:2023-03-19 13:30:37 科技观察

说说一类程序员在Kotlin之前没有经历过的事情。看了几篇耸人听闻的博文,我也对他们冷嘲热讽。以Kotlin为例,有人写了几篇类似《WhydidIgobacktojavafromkotlin》的博文批评kotlin。如果你有时间阅读这些热门博文,何不看看AndroidDeveloper官网上的所有示例代码,其中kotlin版本在前,java版本在后?争论语言和框架的优缺点是没有意义的。很多程序员总是赞美自己一直在使用的语言和框架,而贬低其他语言和框架。很明显,这样的程序员太狭隘了。Java确实常年流行,难道其他语言就没有意义了吗?当然不是,就算是批评,也要亲身体验过才有资格。这不是复制你所做的,毕竟对于一个真正的程序员来说,学习一门新语言是很容易的。Kotlin简洁的语法给我的感觉就是针对Java的所有痛点做出改变,比如繁琐的语法,烦人的空指针,缺乏函数式编程支持(Java8支持Lambda表达式,但还远远不够),等等。与它的孪生兄弟Scala的奔放不同,Kotlin给我的印象是聪明内敛。对于Java程序员来说,上手半天就够了,不像Scala门槛高。Java语言是我接触过的语言中语法最繁琐的(如果比较繁琐请告知)。这种繁琐可以体现在main函数上,Java也可能是唯一一个几乎用不上IDE的语言。没有IDE的语法警告和代码生成模板,其他语言勉强能写。您是否尝试过Java代码?但是Java严谨繁琐的语法恰恰是Java如此受欢迎的原因。没写过Java的人可能看不懂这句话。人们不满足于Java严格的语法,不得不加入check-style、findbugs,以及XXX公司Java代码规范的各种规章制度。最终的结果是所有Java程序员编写的代码都可以相互理解交互。即使是刚刚毕业的Java程序员,只要熟悉Java面向对象的语法,几乎没有看不懂其他Java代码的情况(业务除外)。这保证了Java程序员的代码下限非常高,可以保证大型项目的成功。看来Java有点过分了。接触过Kotlin后,你会发现Kotlin在极大简化Java代码的同时,尽可能保持与Java一样的语法严谨性,写起来非常爽。//快速创建Bean类dataclassPerson(valid:Long,varname:String,varage:Int)funmain(){//创建实例valzhangsan=Person(0L,"zhangsan",23)//设置/获取方法zhangsan.age=24valname=zhangsan.name//复制方法vallisi=zhangsan.copy(id=1,name="lisi")//默认生成tostring和equals/hashcode方法,可以改写zhangsan.toString()zhangsan.hashCode()varisEqual=zhangsan.equals(lisi)}简洁的语法无处不在。比如上面的Bean类,如果是用java写的,至少要多出几倍的代码。单例模式只需要将类替换为对象即可。虽然这些可以用JavaIDE的各种模板生成工具秒级生成,但还是用kotlin写起来舒服一些。我想强调的是,Kotlin并没有盲目地使用语法糖和新关键字来精简语法。我们可以明显感觉到,Kotlin在设计过程中尽量保证其语法的严谨性。空指针Java的空指针异常被称为“BillionDollarMistake”。在我之前的公司,为了避免空指针异常,代码规范要求几乎所有的对象都进行空判断。对于那些嵌套很深的JSON对象,判断null真的又臭又长。valname:String?//我想在这里吐槽一下为什么kotlin中没有三元运算符?name=if(Random.nextBoolean())"Ann"elsenull//加上?只有当name不为null时才会调用,而且获取到的len1类型也有一个问号,即Int?,没有问号vallen2=name?.length?:0//加双感叹号其实是java中什么都不写的方法。如果为null,则会报空指针异常。vallen3=name!!.length上面的代码解释了可能为空的对象的三种处理方式。事实上,我将Kotlin对空指针的处理归类为为所有对象添加一个泛型类型——符号?。对于带有?的对象,表示它可能为空。空指针试图在编译期间终止。这个想法真的很简单,也很巧妙。很多人一听到Kotlin就说没有空指针,但是没用过不知道怎么实现。现在面试官再问你,你知道怎么回答吗?函数式编程funAppCompatActivity.setupActionBar(@IdRestoolbarId:Int,action:ActionBar.()->Unit){valtoolbar=findViewById(toolbarId)setSupportActionBar(toolbar)supportActionBar?.run{//执行参数中的函数,所以用户在调用方法action()}toolbar.setNavigationOnClickListener{Log.d("AppCompatActivity","finish")finish()}}//--------------------分割线-----------------------------//类似的单方法界面只需要写一个闭包binding.aliPayIcon.setOnClickListener{Log.d("example",it.contentDescription.toString())}//扩展函数let,只有对象不为空时才会调用,等价做出空洞的判断。方法属性,一个好处是可以直接操作对象,不需要先生成变量vm.accountName.apply{this.value="aaaa"Log.d("example",this.value?.toString()+":"+this.hashCode())}//还有其他基本的扩展函数run,with,also等,可以看这篇博客的介绍:https://www.函数式编程对于很多Java程序员来说非常陌生。虽然不想黑,但是Java真的够强大,很多Java程序员只知道Java这门语言,基本没接触过Java8以上的。除了Java(Java8以下),真不知道哪个语言不支持函数式编程。几乎所有的语言都支持函数式编程,所以灵活运用函数式编程真的很重要。Java不支持是因为函数式编程相对困难,而缺乏对函数式编程的支持使得Java代码的下限更高。函数式编程除了比较难之外,最讨厌的就是可读性差(可能更依赖于写代码的人的水平)。Java框架源码我觉得基本是顺畅的,但是看JavaScript框架简直是一头雾水。以我现在的水平,看懂Kotlin函数式代码也有难度,但kotlin毕竟是一门强类型语言。如果函数的参数和返回值类型是固定的,仔细阅读也不难。扯远了,函数式编程的好处就是代码的灵活性加倍了,各种show操作都可以写代码。显然,这也是一把双刃剑。但是随着函数式编程越来越流行,大家的水平也越来越高,写出来的函数式代码也势必会越来越好。可以说Java程序员学习Kotlin的唯一难点就是函数式编程。当然,如果你自己有函数式编程经验,这不是问题。如果没有,你必须学习和理解函数式编程。这是一个比较漫长的过程。在熟练之前,不用函数式编程也可以写Kotlin。结论总的来说,我对Kotlin的评价总体上是正面的。但是,有些人的脑回路不正常。我还是想说一句:说Kotlin好,有优势,立马有人惊呼Java要被取代了!两天后,有人喊Kotlin不好,马上就要凉了。相信你也了解Java的好处和适用范围。现在还被广泛使用的语言各有优势,这个就不说了,毕竟水平不够。真的很反感一些博主和公众号吞吃人气发软文互相欺骗。别听我和谷歌说好,也别听那些博主说不好。如果你有时间坐下来谈谈,为什么不花半个小时来体验一下Kotlin?