Java程序员为何沉迷于get/set?一场集体行为艺术观察


2025年03月10日 13:31 溪流

某天我盯着同事的Java代码,突然发现一行注释:

1// TODO: 十年后记得删除这些getter

这行字让我猛然意识到:整个Java界都在集体表演行为艺术。

一、自相矛盾的"封装优势论"

"封装是为了灵活修改字段行为",这是get/set原教旨主义的圣经。但请看这段经典悖论:

1public void setAge(int age) {
2    this.age = age + 1; // 偷偷篡改值
3}

当你在代码评审会上质问"为什么年龄总比设置值大1",对方会拍案而起:"谁让你直接读字段的?必须走getter!"

于是维护时:

  1. 需要追溯所有调用方是否知晓魔法+1
  2. 需要防止其他开发直接访问字段
  3. 需要为这个魔法行为写三页文档

此时封装论者突然改口:"这种魔改违反契约精神!" 所以封装到底是为了方便篡改,还是禁止篡改?这是个薛定谔的猫式的伪命题。

二、21世纪的代码复制术

某Java项目统计:

当你想用IDE自动生成时,老派Javaer会怒斥:"自动生成代码不优雅!" 这就像中世纪抄经僧反对印刷术——手抄佛经更显虔诚。

更黑色幽默的是,当Lombok用@Getter消灭这些冗余代码时,反对派又祭出"破坏纯Java特性"的大旗。所以Java的纯洁性必须用数万行机械代码来守护?

三、IDE打脸现场

"没有get/set怎么批量修改字段?" 请打开IntelliJ:

  1. 右键字段 -> Refactor -> Rename
  2. 全项目引用自动更新

现代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规范本质是场传销:

  1. 先规定get/set是"标准"
  2. 让所有框架强制依赖这个标准
  3. 新框架必须继续跪拜旧标准
  4. 成功锁死整个生态

现在连官方都陷入困境:record本可以终结这场闹剧,但为了兼容Bean规范,不得不在语义上开倒车。这就像发明汽车时,非要给发动机预留马鞍接口。

六、宗教狂热现场

最可怕的不是技术缺陷,而是教徒们的自我感动。当你质疑get/set时,他们会:

  1. 搬出23种设计模式
  2. 背诵"封装继承多态"三字经
  3. 祭出"大厂规范"免死金牌

但翻开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注解吵得面红耳赤。

八、邪教心理学分析

为什么聪明人会维护明显荒谬的设计?这涉及三个心理机制:

  1. 沉没成本谬误:写了二十年get/set的人不愿承认徒劳
  2. 权威崇拜:官方规范就是圣经
  3. 集体安全感:跟着大部队跳崖比独自生存更安全

get/set本质是Java生态自循环的农耕文明:因为工具链依赖,所以必须写;因为都在写,所以工具链继续依赖。这个死循环唯一的破解方式,就是承认我们集体演了二十年皇帝的新衣。

当新晋程序员疑惑"为什么要写这些废话"时,老Javaer总会神秘一笑:"等你工作十年就懂了。" 现在我终于明白——这是编程界的成年礼仪式,用数万行无意义代码证明:你已成功被体制化。

这场行为艺术何时谢幕?或许要等到最后一个反对Lombok的Java程序员退休。在此之前,请保持虔诚,阿门。

下次当你生成get/set时,不妨对着镜子问问:我是在设计对象,还是在给IDE当人肉代码生成器?当你的getter只是return field,setter只是this.field=field时,所谓的"封装"不过是在代码里刻正字——除了感动教众,还剩什么?

如需讨论,欢迎到知乎文章页面发表评论。





©2004-2025 溪流网站 保留所有权利