Kotlin 入坑半年总结

2017-07-08 00:43:01 +08:00
 sagaxu

半年前我在一个两年历史的后端 Java 项目中,尝试着引入了 Kotlin,半年过去,证明了当时的尝试是值得的。分享一下我的感受。

优点

缺点

目前项目中一共有 200 多个 Java/Kotlin 代码文件,2/3 已经是 Kotlin 的了,估计半年后 Kotlin only 了。 下半年准备尝试用 coroutine 改造一下现有的多线程架构,3000 个线程已经限制到某些产品上的玩法了,异步回调的话又不太适合调用栈很深并且各种分支和跳转的业务,kotlin 的协程,可以直接 wrap 现有的异步的库,设计思路上很赞,充分利用现有的库。

kotlinjs 虽然正式发布了,但是 runtime 太大,而且我已经用 coffeescript 了,就没有尝试。

kotlin native 目前继续观望,也许明年会在合适的地方尝试一下,这也是个比较有趣的东西。

53461 次点击
所在节点    Kotlin
31 条回复
notreami
2017-07-08 15:21:33 +08:00
@sagaxu 除了简洁,不觉得语法上限制会导致特性上的限制,而且完全可以造一段语法出来,比如注解、lambda。Kotlin 体系不完整指的是需要依赖 java 提供生态,而不是像 Scala 一样,完全可以自成生态(可以预想,以后 android 的开源库应该大部分都是纯 java 写)。
go 或者 js 我提的是掌握,不只是它们的语法,还包括它们的生态库。这样拿来和 Kotlin 对比才有价值。

把 Kotlin 引入除了语法糖,一直觉得没有什么意义。甚至还不如好好把 gradle 掌握了更有意义。


未免不必要的麻烦。综上,我想表达是,需要掌握的技能栈很多,一门技能栈好上加好的价值大还是横向扩展技能栈的价值大。毕竟人的时间有限,除非你很聪明,比我学习和掌握一门技术所花时间短很多,那就当我没说过,毕竟你时间多。
fly2never
2017-07-08 16:57:06 +08:00
方法数会增加多少? Android 上
sagaxu
2017-07-08 16:57:32 +08:00
@notreami 注解只能缓解,不能根治语法的不足,比如做 DSL 的时候,用 Java 就很麻烦,用 Kotlin 或者 ruby 就很简单。

像这样一段 DSL,你用 Java 和注解可以很简单的实现吗?

html {
head {
title { +"XML encoding with Kotlin" }
}
body {
h1 { +"XML encoding with Kotlin" }
p { +"this format is now type-safe" }

/* an element with attributes and text content */
a(href="http://jetbrains.com/kotlin") { +"Kotlin" }
}
}

gradle 之所以用 groovy 做 build 的 DSL,也是因为语法表达灵活,现在 gradle 也支持 Kotlin 的 DSL 了,写法跟 groovy 的基本一致。


Kotlin 不自己造轮子,充分利用 Java 的库,这正是它最聪明的地方,因为数据结构都是 Java 的,跟 Java 才没有 interop 的麻烦,Kotlin 调用 Java 或者 Java 调用 Kotlin,不用做数据结构的转换,也不用任何 wrap,就跟调用自己语言写的库一样方便。一段 JVM 字节码,是 Java 编译来的,还是 Kotlin 编译来的,没什么明显差异,所以原生不原生也无从谈起了。

在技术的路线上,是深度更有价值还是广度更有价值,因人而异,同一个人的不同阶段答案也不同。
wohenyingyu02
2017-07-08 17:05:49 +08:00
kotlin 可以直接调用 c 的动态库么,swift 就是因为无法直接调用还需要 oc 转一层,被我放弃了
succlz123
2017-07-09 00:32:59 +08:00
代码混淆 需要作特殊处理么
Miy4mori
2017-07-09 04:48:15 +08:00
只能说看起来很美吧,null safe 在和 java 库交互的时候就被废了一半,其他的特性也没有解决什么实质的问题,只是看起来舒服了一些。
sagaxu
2017-07-09 12:01:31 +08:00
@wohenyingyu02 Kotlin 在 JVM 调 C 库等同于 Java,Kotlin Native 只能调 C 库不能调 Java 库。

@succlz123 JVM 字节码混淆工具,理论上不应该区分 Java 和 Kotlin 生成的字节码。

@Miy4mori null safe 跟 Java 交互,调用 Java 的时候可以保证不会传不该 null 的 null 给 Java,获取 Java 返回值的时候可以写个!!后缀假定它是 nonnull 的,也可以假定它是可以 null 的,并不会损失 null safety。
能写的舒服一点,读的舒服一点,顺带稍微减少点 bug,已经足够了。

Kotlin 协程不知道算不算解决的实质问题,如果不用协程,我们新的需求要把 3000 个线程变成 30000 个,而用 akka 或者 vertx 这样的库又很难处理复杂业务逻辑,每次请求都要调用几十个服务,状态个数都超过 100 个了。如果不是有 Kotlin 协程,都计划用 Go 语言重写,放弃 JVM 了。
williamwue
2017-07-24 10:32:30 +08:00
@sagaxu 写得很精彩,准备在项目中开始局部使用来学习一下
hantsy
2017-08-26 21:50:11 +08:00
@sagaxu 帮忙 review 下我的问题: https://www.v2ex.com/t/386021

现在应该不需要 AOP 也可以在 Spring 中用,后面再清理一下 Gradle BuildScripts 文件。Spring 5 中提供有 Kotlin 集成,如 BeanDefinitionDSL,RouterFunctionDSL, 基本项目配置可以用 Kotlin DSL 声明,可以不用 Annotation 了,我的 Sample 也不没有用 Spring Boot 启动程序了。
darkread
2018-01-04 14:44:06 +08:00
@notreami 我觉得你这个说法很奇怪。你 golang 可以用 java 库么?你的 js 可以用 java 库么?都不行。你说转 golang,那你转吧,Go 是很火,你想清楚要造多少轮子,再说,有没有是一回事,好不好是另外一回事。java 有 Spring,Go 有 GoBee,但是事实上,GoBee 有很多问题。你愿意一个个去尝试,就去吧,不要误导别人啊。
kotlin 可以啊,我有简便的 null 检查,不需要写丑陋的 helpler,为什么不用?我 lambda 是一类公民为什么不用?
说对了,就是爽!就是代码少!你等 java9 来了,你用么? Java9 有 kotlin 好用么?
等 Oracle 收购?你做梦吧,kotlin 是 gg 宣布支持的第三个 Android 顶级语言,为什么不就是为了对抗 Oracle 向 GG 收取 java 收取费么?会把对抗武器卖给敌人?
winniewhwh
2018-11-06 16:53:19 +08:00
Java 要收费了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX