为避免数据在分发过程中被恶意篡改,Kotlin 将 SealedClass 参数设置为 val 即可,
Java 17 以下未引入 SealedClass ,且若实现 Kotlin val 同等效果,样板代码瞬间飙出许多,等于是解决了数据一致性的同时,滋生了更多 “不一致” 问题,例如日后修改某字段,而忘配置构造方法等等。
痛定思痛,SealedClass4Java 应运而生,通过注解自动生成 SealedClass ,像 Kotlin 一样使用 SealedClass 。
献给喜欢 Kotlin 但又不得不维护 Java 老项目的朋友。
1
haya 2022-08-31 11:37:51 +08:00
编译期生成的东西如何做到 idea 不飘红
|
2
Kasumi20 2022-08-31 11:45:55 +08:00
你在 Java 里面用这个密封类干嘛呢,要解决什么问题呢,Kotlin 使用密封类是由于子类完全确定,可以在 when 表达式中涵盖所有情况
|
4
KunMinX OP @haya
之前维护的 KeyValueX 是通过类反射方式,让巨型项目不用初始化编译即可直接套用接口。 SealedClass4Java 基于其场景,倒是很难这么做,不过权衡代码安全等角度问题,我个人可忽略这个问题。 |
5
optional 2022-08-31 12:36:59 +08:00 via iPhone
想要的是 rust 里的 enum ?
|
8
licoycn 2022-08-31 14:35:57 +08:00
那为什么不直接使用 Java 17
|
10
qW7bo2FbzbC0 2022-08-31 19:07:03 +08:00
新手问下,为什么 Javascript 中的 Babel 转译插件在 Java 及其他语言中很少见,如果能把 Java17 的代码转译成 Java8 的中间结果,既能在 jdk1.8 上执行又能使用 Java17 的语法特性,岂不是很棒
|
11
changdy 2022-08-31 20:58:09 +08:00
@qW7bo2FbzbC0 这是个好问题 ,初看简单 但是想想还是蛮有趣的.
我觉得主要还是和运行环境有关 , 对于 前端来说需要充分考虑各种浏览器兼容问题 .所以需要 babel 抹平环境的差异. 而对于 后端来说 ,运行时是确定的 并且唯一的 当然现在来说 已经好很多了 , css 前缀, ajax fetch 也都已经统一了 .. 但仍旧 存在部分语法 ,高版本的浏览器 支持 ,低版本的不支持 ,这也就是 babel 的价值 |
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 插件。 |
13
zmal 2022-09-01 09:48:43 +08:00
@qW7bo2FbzbC0 你说的不就是 scala 、kotlin 、grovvy 之流么?可以在 JVM 上跑,可以用 JDK ,还可以和 Java 混合编译。
|