使用 java11 语法来开发安卓

2021-06-23 12:41:52 +08:00
 ikas

安卓 d8 字节码翻译器很早就支持了 java11+大部分的语法,个人已经用了半年多,无任何问题

//1 切换到 11 JavaVersion.VERSION_11

//2 加入 sdk 路径 compileOnly files("sdk ... android.jar")

7369 次点击
所在节点    Android
22 条回复
ikas
2021-06-23 12:42:21 +08:00
//3
如果你用到了 viewBinding,还需要解决下 as ide 的一些问题
apply plugin: 'idea'
idea {
module {
sourceDirs += file("${module.project.buildDir}/generated/data_binding_base_class_source_out/debug/out")
}
}
ikas
2021-06-23 12:45:43 +08:00
//2. 第二个可以这样
compileOnly files("${android.sdkDirectory.path}/platforms/${android.compileSdkVersion}/android.jar")
AoEiuV020
2021-06-23 13:12:57 +08:00
公司项目安卓插件版本还是 3.4.1,估计用不了这些新功能,
Smash
2021-06-23 13:25:21 +08:00
还不如直接 kotlin,省事儿。
pipilu
2021-06-23 13:27:03 +08:00
java 11 有啥特别好用的语法,商业上还不太敢升级
loshine1992
2021-06-23 13:38:14 +08:00
Kotlin 就可以了
ikas
2021-06-23 15:19:50 +08:00
@pipilu
安卓端能用到的其实不多,但是只一个 var 就可以大量简化代码了.实际后端我们都用了好几年的 java11+了
ikas
2021-06-23 15:20:27 +08:00
@Smash
@loshine1992
多一种选择只是...毕竟不是所有项目都会直接转到 Kotlin ,也不是所有人都喜欢 Kotlin ...
zongren
2021-06-23 15:53:01 +08:00
兼容 android 版本多少?
qwerthhusn
2021-06-23 15:58:06 +08:00
@pipilu
List.of(1, 2, 3) Set 也是一样
Map.of(1, "a", 2, "b")
Map.ofEntries(Map.entry(1, "a"), Map.entry(2, "b"))
我就知道个快速构建不可变集合,可以取代 Guava 的 ImmutableXXX 系列

String 加了一些实用方法,可以取代 commons-lang3 的 StringUtils 一些方法

Files 类加了一些实用方法,比如一行代码读取文件的内容获取字符串,可以取代 commons-io 的 FileUtils 一些方法

var 可以取代 lombok 的 var,不过个人不是很喜欢用 var

其他的从写代码的角度,我没感觉到有太多改进。。。
ikas
2021-06-23 16:43:03 +08:00
@qwerthhusn 是的,主要是 java 本身到了 16 变化的也不太多.另外安卓这边对高版本的兼容也不够.目前使用这种 hack 方式,只能到 11,其实 d8,可以支持 11 12 的一些.不过 d8 脱糖后,基本跟 j8 没有区别,这个跟 java 本身不一样
List.of 这一类的还比较恶心,安卓需要高版本才行
ikas
2021-06-23 16:44:30 +08:00
@zongren 理论只要 D8 脱糖支持,与安卓版本没有太大关系,如果非要说关系,安卓不同的版本对 jdk11 中的 api 支持是不同的,低版本可能没有对应的 api
passerbytiny
2021-06-23 18:09:25 +08:00
Java8 以上的版本,跟 8 相比,基本上没有语法差异。事实上整个 API 从 9 以后就基本没再变过,而 9 又只是完成 8 的 TODO 。

别看它更新那么欢,但它只敢更行性能相关的底层代码。
ikas
2021-06-23 18:21:21 +08:00
@passerbytiny 怎么说呢.var 推断,switch 模式匹配 /解构,"""字符串,instanceof 解构这些都是实打实的语法变化了吧
至于 api,那就更多了
xuhengjs
2021-06-23 20:39:40 +08:00
instanceof 是 jdk14
douglarek
2021-06-23 20:43:04 +08:00
kotlin 都原生支持了不比 Java 11 用着爽吗
cubecube
2021-06-23 20:45:09 +08:00
NPE 的错误提示还是不错的。
instanceof 能少些一些转换
switch 真的不错
passerbytiny
2021-06-24 11:48:36 +08:00
@ikas
var 是 8 的 TODO,它更是之前就被 lombok 采用。

模式匹配,是 14 引入 16 (今年 3 月)才正式化的。6 年了才敢加一个类 lombok 的语法。

目前的 JCP,集中与 Oracle 的主要开发者一言堂但却不是最终用户,几大开源社区和 IBM 无为而制,谷歌基本已经算分裂势力。这样的 JCP,很难出现会导致兼容性问题的 API 大动。
fly2never
2021-06-24 12:18:54 +08:00
@AoEiuV020 为啥不升级一下
ikas
2021-06-24 12:55:58 +08:00
@passerbytiny
var 本身只是类型推断的一种,java8 本身对类型的推断支持也足可以做到 var,但是涉及到语言语法,java 一向是保守的.

说真的,如果不是 oracle 收购 java,那 java 更不会有今天的发展,参考 java9 各大社区 /公司的分歧导致延期那么久就可以看到.

另外现在说到 api,其实最近几版的 jdk,已经加入了不少 api,比如 Vector API ,Memroy ApI,Foreign Linker API 等

还有为了进一步提高 java 性能与支持基本类型的泛型 /统一类型,又加入了 JEP 401: Primitive Objects (Preview)与 Unify the Basic Primitives with Objects (Preview),这些反而变化又很大,甚至现在版本已经对一些用法加入了 warning

然后为了追平其他语言的协程,现在已经可以下载测试使用的虚拟线程版本的 project loom

个人对加入 oracle 的 java 是看好的...

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

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

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

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

© 2021 V2EX