-
我在 TypeScript 里给函数参数标了个空对象大括号类型、想表示只收一个对象,结果传数字、传字符串、传布尔值进去编译器全都不报错照单全收,我盯着那对空大括号愣了半天,最后才搞懂这个看着像空对象的类型实际表示的是除了 null 和 undefined 之外几乎任何值的深度复盘
我写了个函数本意只接收一个对象(任意结构都行但至少得是对象、不能是基本类型),很自然把参数类型标成了 {}——直觉里 {} 不就是一个空对象引申为任意对象嘛,以为这样就能限制住只准传对象。可写着发现不对:把 42、hello、true 这些明显不是对象的值传进去编译器一个错都不报,这道我以为加上的只准传对象的约束形同虚设。我以为哪里写错了、反复确认参数类型就是 {},又怀疑 strict 没开也开…- 0
- 0
-
缓存命中率离奇趴在 0%:Java equals 与 hashCode 避坑
一个跑得好好的 Java 服务,某次我顺手看了眼缓存命中率监控,当场愣住:命中率常年趴在接近 0% 的地方,缓存等于白做,内存里那个缓存 map 倒越涨越大,光占地方不干活。打日志一比对更迷惑——两个 key 在日志里长得一模一样,map.get(key) 却就是返回 null。扒开那个作为 key 的自定义类,真相经典得让我有点不好意思:它重写了 equals 让业务上相等的对象被判相等,却偏偏…- 0
- 0
-
从 Java 6/7 古早体系 + 一堆 getter/setter 样板 POJO + null 满天飞到处 NPE + checked 异常层层 try-catch 吞掉 + for 循环命令式遍历 + 手撸 Thread 加 synchronized 加锁 + Date/SimpleDateFormat 非线程安全 + finally 手动 close 资源经常漏 + instanceof 加强制转型分支 古老 Java 体系 → 2026 Java 21 LTS + record 不可变记录 + Optional 显式可空 + Stream 声明式 + Lambda 函数式 + 虚拟线程 Loom + CompletableFuture 异步编排 + java.time 不可变线程安全 + sealed 类与模式匹配 switch + try-with-resources 自动资源管理 + var 推导 现代 Java 体系 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
16 位 Java 后端工程师 87 天把一套跑了八年的古老 Java 体系——一堆 getter/setter 样板 POJO、null 满天飞到处 NPE、checked 异常层层 try-catch 吞掉、for 循环命令式遍历集合、手撸 Thread 加 synchronized 共享加锁、Date/SimpleDateFormat 非线程安全偶发乱码、finally 手动 close 资…- 9
- 0
-
从 Java 8 + Spring Boot 2 + 阻塞 Servlet + 线程池硬扛 + Maven + 贫血模型 远古单体 → Java 21 LTS 虚拟线程 Loom + Spring Boot 3.4 + record/sealed/模式匹配 + StructuredTaskScope + GraalVM Native + Gradle + JUnit5/Testcontainers 现代全栈 91 天踩坑录:阶梯式跃迁 + 89 套修法 + 7 个 P0 复盘 + 6 条工程哲学
31 位 Java 后端工程师 91 天用阶梯式跃迁把一套跑了十年、累计 89 万行的 Java 8 + Spring Boot 2 + 阻塞 Servlet 远古单体,平滑迁移到 2026 年 Java 21 LTS 虚拟线程 Project Loom + Spring Boot 3.4 + record/sealed/模式匹配 + StructuredTaskScope + GraalVM N…- 4
- 0
record
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!




