当前位置: 首页 > news >正文

写了这么多年 Java,这几个神仙技巧你真的用过吗?

沉默是金,总会发光

大家好,我是沉默

如果你也是从
public static void main(String[] args)

System.out.println()
开始 Java 生涯的,那八成已经是“老 Java 人”了。

上班这些年,我们每天都在写业务代码:
CRUD、DTO、Service、Mapper……

代码能跑、需求能交,但也常忍不住吐槽一句:

Java 是不是有点笨?

写点事,咋这么多样板代码?

但真相是——
笨的不是 Java,而是我们还在用旧姿势写新 Java。

从 Java 8 到今天的 Java 21/25,Java 一直在进化:
语法在变、抽象在升级、写法在变轻。

下面这几个技巧,都是我在真实项目里反复用、越用越香的东西。
来看看,你用过几个。

-01-

1-2

① 用枚举(Enum)干点正事,而不是只当常量

很多人对枚举的理解还停在:

MALE, FEMALE

但实际上,枚举=自带多态的轻量策略类

比如:会员等级折扣。

与其写一堆if-else/switch,不如直接让逻辑“住”进枚举里。

public enum MemberType {REGULAR {@Overridepublic double applyDiscount(double price) {return price * 0.98;}},VIP {@Overridepublic double applyDiscount(double price) {return price * 0.9;}},PREMIUM {@Overridepublic double applyDiscount(double price) {return price * 0.8;}};public abstract double applyDiscount(double price);}

使用时非常干净:

double finalPrice = MemberType.VIP.applyDiscount(100);

没有 if
没有 switch
新增会员 ≈ 新增一个枚举值

这就是最符合开闭原则的业务写法之一

② 用 Record,砍掉 80% DTO 垃圾代码

以前写一个 DTO 是什么体验?

  • private final 字段

  • getter

  • equals

  • hashCode

  • toString

要么手写,要么全靠 Lombok。

现在?一句话。

public record UserProfile(String username, String email) {}

直接用:

UserProfile user = new UserProfile("dev_user", "user@example.com");System.out.println(user.username());System.out.println(user);

不可变
语义清晰
编译期生成完整方法

-02-

3-4

③ 给 ID 穿一层“类型外衣”,让编译器帮你查 Bug

如果你写过这种方法:

void process(Long userId, Long orderId)

那你一定也踩过这种坑:

process(orderId, userId); // 编译通过,逻辑反天了

解决方案很简单:
让 ID 拥有自己的类型。

public record UserId(long value) {}public record OrderId(long value) {}
void process(UserId userId, OrderId orderId) {}

现在如果你传反了?

直接编译失败

这就是:
把线上问题,提前杀死在 IDE 里。

④ Stream 清晰表达业务意图

需求:

从产品列表里
找到价格 > 500 的
返回名字

传统写法:循环 + if + list。

Stream 写法:

List<String> result = products.stream().filter(p -> p.price() > 500).map(Product::name).toList();

业务意图一眼可读
没有临时变量
天然支持并行与组合

你不再描述“怎么做”,而是在描述“要什么”。


-03-

5-7

⑤ 文本块(Text Block):终于能轻松写字符串了

以前在 Java 里写 JSON / SQL,像在拆炸弹:

"{\n" +" \"name\": \"Alice\",\n" +" \"age\": 30\n" +"}";

现在:

String json = """{"name": "Alice","age": 30}""";

所见即所得
没有转义符
可读性直接拉满

写 SQL、模板、JSON 的幸福感,瞬间 +100。

⑥ Optional :不是替代 null,而是表达“可能不存在”

Optional 的价值不在于“少写 if”,
而在于语义强约束

这个方法,可能没有值。

repo.findUserNameById(id).ifPresentOrElse(name -> System.out.println("找到用户:" + name),() -> System.out.println("用户不存在"));

强制调用方思考空值
链式表达业务分支
极大降低 NPE 风险

⑦ 新语法再香,前提是:你得能随时切 Java 版本

说句大实话:

  • 老系统:Java 8

  • 新项目:Java 17 / 21

  • 自己学习:Java 25

本地要不停切 JDK,真的会心态爆炸。

这时候,我强烈推荐一个工具:ServBay

它最大的价值就一件事:

帮你无痛管理多个 Java 版本

  • Java 8 / 11 / 17 / 21 并存

  • 项目级指定 JDK

  • 完全隔离,互不污染

你不再折腾环境变量,
而是专心写代码、玩新特性

-04-

总结

Java 一直未老
老的是我们写 Java 的方式

当你开始:

  • 用 Enum 代替 if

  • 用 Record 消灭 DTO

  • 用类型约束代替约定

  • 用 Stream 表达意图

你会发现:
Java,其实一直都挺优雅。


你还有哪些“私藏”的 Java 神仙写法?
欢迎在评论区一起交流...

-05-

粉丝福利

我这里创建一个程序员成长&副业交流群,

和一群志同道合的小伙伴,一起聚焦自身发展

可以聊:

技术成长与职业规划,分享路线图、面试经验和效率工具,

探讨多种副业变现路径,从写作课程到私活接单,

主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。

如果你对这个特别的群,感兴趣的,

可以加一下,微信通过后会拉你入群,

但是任何人在群里打任何广告,都会被我T掉。

http://www.jsqmd.com/news/101099/

相关文章:

  • Zipkin 深度解析:核心原理、集成实战与最佳实践
  • 20 万级新能源 SUV 标杆车型盘点:从技术到体验的全面对比
  • Java新手做毕设:用雷池WAF护SpringBoot项目,避免演示时出洋相
  • 微服务踩坑实录:SpringCloud集群用雷池WAF,解决3个跨服务防护难题
  • Google Drive下载神器:gdrivedl使用完全指南
  • 7.2.2-bpf对tcp请求的监控(项目)
  • AES-GCM加密全流程解析
  • 开源精神再现辉煌:LobeChat推动AI普惠化进程
  • 第三讲:如何用 AI 快速生成可用应用——实战示例
  • NVIDIA Profile Inspector终极指南:从入门到精通的完整图形优化手册
  • 内容解锁神器:Bypass Paywalls Clean 让你告别付费墙烦恼
  • Linux CFS(完全公平调度器)原理与实现细节全解析(2)
  • SillyTavern轻松搞定版本升级:从焦虑到自信的无忧指南
  • 10分钟精通原神智能助手:从零到精通的完整配置指南
  • 视频创作者必看!这7个素材网站
  • LangChain 1.0 VS LangGraph 1.0:智能体我该用哪一个?
  • 比手动排查快10倍:自动化修复Python库缺失问题
  • 怎么查看自己Ubuntu剩余空间有多少个G呢?
  • LobeChat镜像优势详解:为何它成开源大模型前端首选?
  • LobeChat医疗健康问答合规性讨论
  • 5分钟验证:不安装运行时也能测试.NET应用的新方法
  • 手写海康OpenApi签名规范,实现手动调用api(sdk:artemis-http-client)
  • MHT-FE710 光纤组合导航系统技术指南:高精度导航的多接口适配与工程实践
  • 吹爆FreeBuds SE4 ANC的新音效 | 浅聊体验
  • 网盘直链解析终极方案:彻底告别下载限制的完整指南
  • 纪念币预约神器:3步实现高效自动预约的终极指南
  • Unity翻译插件终极指南:3步实现游戏无障碍体验
  • Google Drive高效下载终极指南:解锁无限下载潜力
  • vue中的props详解
  • A module that was compiled using NumPy 1.x cannot be run in NumPy 2.0.2 as it may crash. To support