Android 开发,在 Java 和 Kotlin 之间纠结徘徊了好几天

最近想要更新 Metanote Android 版,把 iOS 版上积累的功能和优化移植到 Android版上。由于 iOS 版上 Swift 的空安全机制效果立竿见影,空指针导至的 crash 较之之前的 Android 版大副减少,软件质量大副提升,因此我迫切的希望在 Android 版上也能够用上空安全机制。因此,借此机会重新选择了一次 Android 版的技术栈。

不得不说的 Kotlin

几年前在开始开发 Metanote Android 版时就考虑过 Kotlin,但发现虽然 Kotlin 吹的天花乱坠,但实战中却有很多问题,所以当时就弃用了。这次再次考查,几经尝试,终究是爱不起来。

  1. 不支持受检异常,本身这在函数式编程的语言中并不会是问题,但在 Android 中对于现有的 java io 库的使用影响很大。Kotlin 储多说辞,第一,代码冗长的问题,看下 Swift 是怎么做的, 一个 try? 解决的干净利落;第二,异常滥用的问题,问题在于‘滥’而不在于‘用’,怎么用,如何用是程序员需要解决的问题,而不应是被迫的不能用。
  2. 复杂的语法,IDEA 终究不是设计开发语言的,始终发现不了 Kotlin 的设计哲学,也找不到像欧拉公式一样大道至简的美感,Kotlin 自称自己的设计哲学是“务实”,这个结果却是大而杂的语法。
  3. 储多便利终究是语法糖。spec 文档开篇第一段直接让我想要试一下的心都没了

Kotlin Language Specification is still in progress and has experimental stability level, meaning no compatibility should be expected between even incremental releases, any functionality can be added, removed or changed without warning.

然而,Kotlin 最大优势是 Android 的绝对支持,Google 与 Oracle 故事的结果却是让开发者付出代价,Android 这么做,只能说,让我们拭目以待吧。

再来说 Java

不得不说 java 也一直在改进,但效果却不尽如人意,Optional, Lambda, Stream 并没有预期的好用,而且还存在性能问题,毕竟 java 的历史包袱太重了。随着 Android 与 Java 渐行渐远,不知还能在 Android 上用多久 Java。即便如此,没有 Java 的开拓,也不会有当今储多语言的优化和改进,Java 无疑,仍是一个传奇。

目前的选择,依然认为 Java 可能仍是最好的选择

其它考虑过的方案

  1. 各种跨平台方案,Flutter 当时确实有一点心动,但还是没有选择,而且由于 Compose 的冲击, Flutter 本身也会面临挑战,Google,呵呵。
  2. 在 Android 上使用 Swift ,或直接用 C 和 C++ 做为共享代码层。由于 JNI 的调用效率问题,弃用。

移动开发的技术栈不得不受制于平台,而平台又各怀鬼胎,暗流涌动,大家且行且珍惜。

2 个赞

我的评价是,这很谷歌。

谷歌的 protobuf 也是这个样,不保证兼容性,如果你使用的其他库间接依赖了旧版本的 protobuf 会十分麻烦。

苹果也这样,iOS 17 改了一个使用广泛的基础 API URL.path 的实现,然后哀鸿遍野,各种 bug。这些公司都是有恃无恐,手握资源和用户就各种任性了。

所以开发者保持独立思想太重要了,不盲目跟风。Google 再怎么推 Kotlin 也需要仔细评估。我最后还是用的 Java,并通过一些方法解决了空安全问题,空安全,有异常,高效,几天用下来感觉很好,不输 iOS 上写的 Swift。

想想几年前语言排行榜上 Java 对 OC 是碾压式的存在,现在一个推 Kotlin 一个推 Swift,也都支持服务端,但 Swift 却始终超过 Kotlin,想来广大开发者也是有投票的。