Kotlin Sealed Class 太香了, Java 8 也想用怎么办? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KunMinX
V2EX    Android

Kotlin Sealed Class 太香了, Java 8 也想用怎么办?

  •  
  •   KunMinX 2022 年 8 月 31 日 14020 次点击
    这是一个创建于 1247 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为避免数据在分发过程中被恶意篡改,Kotlin 将 SealedClass 参数设置为 val 即可,

    Java 17 以下未引入 SealedClass ,且若实现 Kotlin val 同等效果,样板代码瞬间飙出许多,等于是解决了数据一致性的同时,滋生了更多 “不一致” 问题,例如日后修改某字段,而忘配置构造方法等等。

    痛定思痛,SealedClass4Java 应运而生,通过注解自动生成 SealedClass ,像 Kotlin 一样使用 SealedClass 。

    献给喜欢 Kotlin 但又不得不维护 Java 老项目的朋友。

    https://github.com/KunMinX/SealedClass4Java

    13 条回复    2022-09-01 09:48:43 +08:00
    haya
        1
    haya  
       2022 年 8 月 31 日
    编译期生成的东西如何做到 idea 不飘红
    Kasumi20
        2
    Kasumi20  
       2022 年 8 月 31 日
    你在 Java 里面用这个密封类干嘛呢,要解决什么问题呢,Kotlin 使用密封类是由于子类完全确定,可以在 when 表达式中涵盖所有情况
    KunMinX
        3
    KunMinX  
    OP
       2022 年 8 月 31 日
    @Kasumi20

    消息分流,但又要确保数据一致性 ...
    KunMinX
        4
    KunMinX  
    OP
       2022 年 8 月 31 日
    @haya

    之前维护的 KeyValueX 是通过类反射方式,让巨型项目不用初始化编译即可直接套用接口。

    SealedClass4Java 基于其场景,倒是很难这么做,不过权衡代码安全等角度问题,我个人可忽略这个问题。
    optional
        5
    optional  
       2022 年 8 月 31 日 via iPhone
    想要的是 rust 里的 enum ?
    dcsuibian
        6
    dcsuibian  
       2022 年 8 月 31 日
    @haya
    @KunMinX
    足够有名,让 idea 开后门,比如 lombok
    zoharSoul
        7
    strong>zoharSoul  
       2022 年 8 月 31 日 via Android
    @dcsuibian 普通的也可以的,不需要开后门。
    lombok 需要是因为非标
    licoycn
        8
    licoycn  
       2022 年 8 月 31 日
    那为什么不直接使用 Java 17
    licoycn
        9
    licoycn  
       2022 年 8 月 31 日
    @licoycn 不好意思,没看维护老项目~~
    qW7bo2FbzbC0
        10
    qW7bo2FbzbC0  
       2022 年 8 月 31 日
    新手问下,为什么 Javascript 中的 Babel 转译插件在 Java 及其他语言中很少见,如果能把 Java17 的代码转译成 Java8 的中间结果,既能在 jdk1.8 上执行又能使用 Java17 的语法特性,岂不是很棒
    changdy
        11
    changdy  
       2022 年 8 月 31 日
    @qW7bo2FbzbC0 这是个好问题 ,初看简单 但是想想还是蛮有趣的.

    我觉得主要还是和运行环境有关 , 对于 前端来说需要充分考虑各种浏览器兼容问题 .所以需要 babel 抹平环境的差异.

    而对于 后端来说 ,运行时是确定的 并且唯一的

    当然现在来说 已经好很多了 , css 前缀, ajax fetch 也都已经统一了 ..

    但仍旧 存在部分语法 ,高版本的浏览器 支持 ,低版本的不支持 ,这也就是 babel 的价值
    mmdsun
        12
    mmdsun  
       2022 年 8 月 31 日
    kotlin 可以和 Java 一起在项目里使用啊。java 8 不算太老的。

    另外旧项目用不了一些特性也很正常,心态放好。。要说的话,sealed 关键字 C#刚出的时候就有了,C#2.0 就支持?可为空类型,C# 3.0 支持扩展函数,10 年前,2012 年就支持 async/await ,更不提委托、事件 LINQ 、Rx 扩展库了。现在反应式编程也是那一套。而我那个时候用 Java7 ,开发安卓、Javaweb ,连用 Lambda 表达式都得用 retrolambda 插件。
    zmal
        13
    zmal  
       2022 年 9 月 1 日
    @qW7bo2FbzbC0 你说的不就是 scala 、kotlin 、grovvy 之流么?可以在 JVM 上跑,可以用 JDK ,还可以和 Java 混合编译。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1004 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:57 PVG 02:57 LAX 10:57 JFK 13:57
    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