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

2022-08-31 10:50:20 +08:00
 KunMinX

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

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

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

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

https://github.com/KunMinX/SealedClass4Java

6268 次点击
所在节点    Android
13 条回复
haya
2022-08-31 11:37:51 +08:00
编译期生成的东西如何做到 idea 不飘红
Kasumi20
2022-08-31 11:45:55 +08:00
你在 Java 里面用这个密封类干嘛呢,要解决什么问题呢,Kotlin 使用密封类是由于子类完全确定,可以在 when 表达式中涵盖所有情况
KunMinX
2022-08-31 11:53:19 +08:00
@Kasumi20

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

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

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

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

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

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

但仍旧 存在部分语法 ,高版本的浏览器 支持 ,低版本的不支持 ,这也就是 babel 的价值
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
2022-09-01 09:48:43 +08:00
@qW7bo2FbzbC0 你说的不就是 scala 、kotlin 、grovvy 之流么?可以在 JVM 上跑,可以用 JDK ,还可以和 Java 混合编译。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876655

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX