使用 java11 语法来开发安卓 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ikas

使用 java11 语法来开发安卓

  •  
  •   ikas Jun 23, 2021 15699 views
    This topic created in 1769 days ago, the information mentioned may be changed or developed.

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

    //1 切换到 11 JavaVersion.VERSION_11

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

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

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

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

    目前的 JCP,集中与 Oracle 的主要开发者一言堂但却不是最终用户,几大开源社区和 IBM 无为而制,谷歌基本已经算分裂势力。这样的 JCP,很难出现会导致兼容性问题的 API 大动。
    ikas
        20
    ikas  
    OP
       Jun 24, 2021
    @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  
       Jun 24, 2021
    要是我的队友敢用 var 这种东西,我一定打死这丫的
    以前写 js 就够折腾的了,现在又想把 java 变成 js
    122006
        22
    122006  
       Jun 24, 2021
    试试我做的类似的项目?
    https://github.com/122006/Zircon
    支持在 java/android 里使用完整的内插字符串功能
    About     Help     Advertise     Blog     API     FAQ     Solana     2531 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 16:07 PVG 00:07 LAX 09:07 JFK 12:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86