关于 Java 笨重一说

查看 930|回复 80
wg20080215   
Java 开发偏工程化,有特定流程要遵守,所以感觉是重量级编程
Python 、Javascript 、PHP 这类偏脚本,自由度大,野路子多,一个文件都能跑起来,感觉就比较轻。如果也按工程标准开发,比如用框架开发,这些语言其实也不轻
cheng6563   
Quarkus 是一种 Java 框架,对比的应该是 SpringBoot 、Vert.x 之类的,拿来和 Java 对比是不太恰当的;另外 AOT 和 JIT 都有自己的应用场景,当下主流的云原生架构在高负载时讲究的是集群弹性,而不是单节点死扛,脱离应用场景,单点能力的对比意义不大哦。
Quarkus 的优势是和 GraalVM 的集成度很高,如果对 JPA ( Hibernate )习惯的话,用 Quarkus 可以无缝从标准 JVM 切换到 GraalVM 来获取 GraalVM 的优秀特性。
推荐视频: https://www.bilibili.com/video/BV1Cb4y1X7Rd
lesismal   
Java 就是典型的功能我有,但设计的非常脑残。
不支持字符串内直接引用变量,只能自己实现,导致 log4j2 神奇漏洞。
泛型拉稀导致反序列化操作非常魔法,日常增加漏洞。
日期 API 也是一坨,现在我宁愿用 DataUtil 直接操作 Date 也不想用 LocalDateTime
Future 设计拉稀,Future 甚至没有执行完毕的 Callback 。基本每个异步框架都有自己设计的“Future”,间接导致 Java 的协程难产。
不支持多行字符串导致一些操作硬是要搞成模板引擎( mybatis )。
至于为了 OO 而 OO ,这是工程化带来的负面效果。但是 Getter ,Setter 依然很蠢。
Servlet 和 JDBC 是纯历史遗留问题,但其实也不算啥问题。
Maven 的版本稳定性秒飞那些直接用 github 当依赖仓库的包管理器。
12101111   
@abcbuzhiming
比如农村里上茅草坑习惯了,后来进城里发现有智能马桶,很是高大上。
GraalVM 就相当于智能马桶。但即便智能马桶,它也还是屎屎相关。
go 可能像是在餐厅里吃饭,餐厅也是修得晚、软装还没完善,经常让小白们感觉斯是陋室,但这里的东西都是可以下咽的。
FrankHB   
别的不提, 就算在别的变成语言中, 要想实现运行时多态, getter setter 即使没有逻辑也得有这个函数, C++的 virtual class 和 Rust 的 dyn trait 也是没法多态的时候访问字段的, C#可以用语法糖但本质上还是函数. 除非像 Javascript 或者 Python 一样把对象的字段做成字符串为 key 的 map(不过这样性能更差)
说白了 java 的笨重就体现在滥用运行时多态上, 像 C++ Rust 都是编译时多态, 很多东西都能先实例化再内联然后就优化掉了,Java 再 jit 也没法把类型已经擦除掉类型的对象的函数内联优化掉
我读过不少 chromium 的代码, 写的跟 java 一样罗嗦,但是调试的时候发现代码几乎都是 inline 的, 带上调试符号, 汇编也很难和代码对的上, jvm 再厉害也不可能做成这样
不过 v8 的 gc 也不比 jvm 厉害, 所以内存占用也不小, 但是运行速度比 jvm 快多了. chromium 这好几千万行的项目要是 java 写的, 恐怕就没有现在前端那一堆东西了, 浏览器能慢成牛
dqzcwxb   
有个这里都没提的:冷启动性能。
一般人会遇到的竞品里怕是没有一个是能比 Java 的实现更加卡翔的。这直接导致拿 Java 写单进程小工具看起来就是没事找抽,直接自绝于一大坨应用领域。
@msg7086 @lanlanye 大部分人眼中的 getter/setter 的问题和提到的没多少关系。很多用户吐槽 Java 这里垃圾,是因为他们想要类似 C#的 property 代替,而 Java 愣是不给。不管用不用 property 代替,都不影响你们这里提的东西。
基于一些深层次的理论问题,我不认为 Java 这里的设计是错的,也不是只有 Java 这样(至少 C++也不给什么劳什子 property 面子)。(具体一点,即便不考虑η-equivalence 这样的异端,这种基于标识符的语法变换缺乏 hygiene 而最终导致语法扩展无法从源码直接推理就够眼烦的了。)不过 Java 这种连 macro 都没的八辈子都别想 call by name 的语言自然就不用纠结这么多,糊 JLS 跟 JEP 的那些大概人也许只是觉得让这种雕虫小技还不如 IDE 帮忙糊代码愉悦罢了。
至于为什么非得 getter/setter 而不是直接拿字段代替,这很大程度上就是用户之间的内部矛盾。
dqzcwxb   
@eason1874 #69 很多人就是把工程化的毛病硬套给语言,搞的好像别的语言工程化之后就没有这样的毛病一样
没有理解为什么需要这样做只是单纯的觉得这样做麻烦繁琐老旧,这种不是在创新而是反智
Lancer777   
@chocotan #48 通篇看下来,大部人的对 java 的认知还停留在 2013 年的 java8 甚至这里还有一些停留在 java8 以前
能够了解 java8 有什么更是少之又少 stream lambda optional localdatetime completablefuture 等等更是完全不懂
后面还有 java11 的 zgc 13 的文本块 14 的 instanceof 等等等等他们更别提能够了解十之一二
在这里给各位通知一下,最新的 jdk 版本是 2022/03/22 发布的 jdk18,而下一个 jdk19 版本正在开发中目前预告的特性中包含协程,请大家务必跟上新时代不要做旧时代守门人
Lancer777   
@abcbuzhiming GraalVM 我已经在生产环境上使用了很久了,并没有什么太大问题,主要问题还是在于 Java 生态圈对于这玩意的支持还是太慢了,Quarkus 的上手成本太高,Spring Native 出来的太晚,并且编译速度太慢,还是要等一段时间才能愉快的使用。
msg7086   
@cheng6563 Java8 的时间类可是借鉴 JODA Time 的,你说设计的一坨?还有多行字符串在新版的 JDK 已经支持了,get ,set 在 OO 语言里面可不是 Java 独有,.net 也是这么写的。协程马上就来了,还有 4 个月,预计 21 就可以出稳定版啊。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部