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

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

  •  
  •   KunMinX · 2022-08-31 10:50:20 +08:00 · 10997 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为避免数据在分发过程中被恶意篡改,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-08-31 11:37:51 +08:00
    编译期生成的东西如何做到 idea 不飘红
    Kasumi20
        2
    Kasumi20  
       2022-08-31 11:45:55 +08:00
    你在 Java 里面用这个密封类干嘛呢,要解决什么问题呢,Kotlin 使用密封类是由于子类完全确定,可以在 when 表达式中涵盖所有情况
    KunMinX
        3
    KunMinX  
    OP
       2022-08-31 11:53:19 +08:00
    @Kasumi20

    消息分流,但又要确保数据一致性 ...
    KunMinX
        4
    KunMinX  
    OP
       2022-08-31 11:56:46 +08:00
    @haya

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

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

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

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

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

    但仍旧 存在部分语法 ,高版本的浏览器 支持 ,低版本的不支持 ,这也就是 babel 的价值
    mmdsun
        12
    mmdsun  
       2022-08-31 22:08:58 +08:00
    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-09-01 09:48:43 +08:00
    @qW7bo2FbzbC0 你说的不就是 scala 、kotlin 、grovvy 之流么?可以在 JVM 上跑,可以用 JDK ,还可以和 Java 混合编译。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 04:52 · PVG 12:52 · LAX 20:52 · JFK 23:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.