V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ikas
V2EX  ›  Android

使用 java11 语法来开发安卓

  •  
  •   ikas · 2021-06-23 12:41:52 +08:00 · 11417 次点击
    这是一个创建于 1248 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    //1 切换到 11 JavaVersion.VERSION_11

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

    第 1 条附言  ·  2021-06-23 15:36:28 +08:00
    其实主要就是可以使用类型推断 var,这样可以减少不少啰嗦的代码,看起来更舒服些
    第 2 条附言  ·  2021-06-23 16:46:45 +08:00
    关于 D8 支持多少 java8+的语法,可以参考 jakewharton 的博文
    jakewharton.com/androids-java-9-10-11-and-12-support/
    22 条回复    2021-06-24 19:19:28 +08:00
    ikas
        1
    ikas  
    OP
       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
        2
    ikas  
    OP
       2021-06-23 12:45:43 +08:00
    //2. 第二个可以这样
    compileOnly files("${android.sdkDirectory.path}/platforms/${android.compileSdkVersion}/android.jar")
    AoEiuV020
        3
    AoEiuV020  
       2021-06-23 13:12:57 +08:00
    公司项目安卓插件版本还是 3.4.1,估计用不了这些新功能,
    Smash
        4
    Smash  
       2021-06-23 13:25:21 +08:00
    还不如直接 kotlin,省事儿。
    pipilu
        5
    pipilu  
       2021-06-23 13:27:03 +08:00
    java 11 有啥特别好用的语法,商业上还不太敢升级
    loshine1992
        6
    loshine1992  
       2021-06-23 13:38:14 +08:00
    Kotlin 就可以了
    ikas
        7
    ikas  
    OP
       2021-06-23 15:19:50 +08:00
    @pipilu
    安卓端能用到的其实不多,但是只一个 var 就可以大量简化代码了.实际后端我们都用了好几年的 java11+了
    ikas
        8
    ikas  
    OP
       2021-06-23 15:20:27 +08:00
    @Smash
    @loshine1992
    多一种选择只是...毕竟不是所有项目都会直接转到 Kotlin ,也不是所有人都喜欢 Kotlin ...
    zongren
        9
    zongren  
       2021-06-23 15:53:01 +08:00
    兼容 android 版本多少?
    qwerthhusn
        10
    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
        11
    ikas  
    OP
       2021-06-23 16:43:03 +08:00
    @qwerthhusn 是的,主要是 java 本身到了 16 变化的也不太多.另外安卓这边对高版本的兼容也不够.目前使用这种 hack 方式,只能到 11,其实 d8,可以支持 11 12 的一些.不过 d8 脱糖后,基本跟 j8 没有区别,这个跟 java 本身不一样
    List.of 这一类的还比较恶心,安卓需要高版本才行
    ikas
        12
    ikas  
    OP
       2021-06-23 16:44:30 +08:00
    @zongren 理论只要 D8 脱糖支持,与安卓版本没有太大关系,如果非要说关系,安卓不同的版本对 jdk11 中的 api 支持是不同的,低版本可能没有对应的 api
    passerbytiny
        13
    passerbytiny  
       2021-06-23 18:09:25 +08:00 via Android
    Java8 以上的版本,跟 8 相比,基本上没有语法差异。事实上整个 API 从 9 以后就基本没再变过,而 9 又只是完成 8 的 TODO 。

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

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

    目前的 JCP,集中与 Oracle 的主要开发者一言堂但却不是最终用户,几大开源社区和 IBM 无为而制,谷歌基本已经算分裂势力。这样的 JCP,很难出现会导致兼容性问题的 API 大动。
    ikas
        20
    ikas  
    OP
       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 是看好的...
    a719031256
        21
    a719031256  
       2021-06-24 13:54:14 +08:00
    要是我的队友敢用 var 这种东西,我一定打死这丫的
    以前写 js 就够折腾的了,现在又想把 java 变成 js
    122006
        22
    122006  
       2021-06-24 19:19:28 +08:00
    试试我做的类似的项目?
    https://github.com/122006/Zircon
    支持在 java/android 里使用完整的内插字符串功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5303 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 07:08 · PVG 15:08 · LAX 23:08 · JFK 02:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.