某天我盯着同事的Java代码,突然发现一行注释:
1// TODO: 十年后记得删除这些getter
这行字让我猛然意识到:整个Java界都在集体表演行为艺术。
一、自相矛盾的"封装优势论"
"封装是为了灵活修改字段行为",这是get/set原教旨主义的圣经。但请看这段经典悖论:
1public void setAge(int age) {
2 this.age = age + 1; // 偷偷篡改值
3}
当你在代码评审会上质问"为什么年龄总比设置值大1",对方会拍案而起:"谁让你直接读字段的?必须走getter!"
于是维护时:
- 需要追溯所有调用方是否知晓魔法+1
- 需要防止其他开发直接访问字段
- 需要为这个魔法行为写三页文档
此时封装论者突然改口:"这种魔改违反契约精神!" 所以封装到底是为了方便篡改,还是禁止篡改?这是个薛定谔的猫式的伪命题。
二、21世纪的代码复制术
某Java项目统计:
- 真实业务逻辑代码:3000行
- get/set方法:5000行
当你想用IDE自动生成时,老派Javaer会怒斥:"自动生成代码不优雅!" 这就像中世纪抄经僧反对印刷术——手抄佛经更显虔诚。
更黑色幽默的是,当Lombok用@Getter消灭这些冗余代码时,反对派又祭出"破坏纯Java特性"的大旗。所以Java的纯洁性必须用数万行机械代码来守护?
三、IDE打脸现场
"没有get/set怎么批量修改字段?" 请打开IntelliJ:
- 右键字段 -> Refactor -> Rename
- 全项目引用自动更新
现代IDE的语义分析早已超越文本匹配。那些坚持用get/set做全局搜索替换的,建议回到Notepad++时代。
四、命名学灾难现场
boolean类型必须用isXXX()的教条,造就了无数精神分裂代码:
1private boolean isVIP;
2
3public boolean isVIP() {
4 return isVIP;
5}
JSON序列化时字段名是"vip"还是"isVIP"?不同框架有不同答案,足够让联调时的你怀疑代码人生。
某电商系统字段叫is3DVerification,getter变成isIs3DVerification()。当这个毒瘤出现在200个DTO里时,团队被迫写了万字布尔字段命名规范——用文档解决代码缺陷,属实滑稽。
五、永远的历史包袱
Java Bean规范本质是场传销:
- 先规定get/set是"标准"
- 让所有框架强制依赖这个标准
- 新框架必须继续跪拜旧标准
- 成功锁死整个生态
现在连官方都陷入困境:record本可以终结这场闹剧,但为了兼容Bean规范,不得不在语义上开倒车。这就像发明汽车时,非要给发动机预留马鞍接口。
六、宗教狂热现场
最可怕的不是技术缺陷,而是教徒们的自我感动。当你质疑get/set时,他们会:
- 搬出23种设计模式
- 背诵"封装继承多态"三字经
- 祭出"大厂规范"免死金牌
但翻开JDK源码,java.time.LocalDate字段全是public final。怎么到咱们写业务代码,就非得给每个String字段套两层壳?
某社交APP曾坚持所有VO手写get/set,结果在十万QPS的序列化场景下,反射调用getter吃掉35%的CPU。改用public字段+不可变对象后,机器成本直接砍半——早干嘛去了?
七、其他语言的降维打击
看C#如何优雅:
1public int Age { get; set; } // 编译后自动生成字段
Kotlin更狠:
1data class User(val name: String)
连C++都在C++20推出了[[no_unique_address]]等现代特性。而Java开发者还在为要不要删掉@Getter注解吵得面红耳赤。
八、邪教心理学分析
为什么聪明人会维护明显荒谬的设计?这涉及三个心理机制:
- 沉没成本谬误:写了二十年get/set的人不愿承认徒劳
- 权威崇拜:官方规范就是圣经
- 集体安全感:跟着大部队跳崖比独自生存更安全
get/set本质是Java生态自循环的农耕文明:因为工具链依赖,所以必须写;因为都在写,所以工具链继续依赖。这个死循环唯一的破解方式,就是承认我们集体演了二十年皇帝的新衣。
当新晋程序员疑惑"为什么要写这些废话"时,老Javaer总会神秘一笑:"等你工作十年就懂了。" 现在我终于明白——这是编程界的成年礼仪式,用数万行无意义代码证明:你已成功被体制化。
这场行为艺术何时谢幕?或许要等到最后一个反对Lombok的Java程序员退休。在此之前,请保持虔诚,阿门。
下次当你生成get/set时,不妨对着镜子问问:我是在设计对象,还是在给IDE当人肉代码生成器?当你的getter只是return field,setter只是this.field=field时,所谓的"封装"不过是在代码里刻正字——除了感动教众,还剩什么?
如需讨论,欢迎到知乎文章页面发表评论。