0
点赞
收藏
分享

微信扫一扫

用AI写Java,你别直接复制粘贴!把这六层"过滤网"装上再动手

上周部门聚餐,新来的应届生小刘端着酒杯凑过来:"哥,听说你以前一天写一千行代码,现在怎么天天下午四点就走了?是躺平了吗?"

我笑了笑,没说话。

其实我不仅没躺平,活还越接越多——上个月我一个人干了三个项目的核心模块,还没加过一天班。

秘诀是什么?

我把AI变成了我的"Java编程副驾驶"。

从需求分析、代码编写、单元测试、Bug修复、性能优化,到代码审查、文档编写——Java开发生命周期的每一个环节,AI都在背后给我撑着。

今天就把这套"AI驱动的Java开发完全指南"全盘托出。不管你是刚入行的Java新手,还是干了十年的老鸟,这篇都能让你少加一半班。

一、先定调子:AI在Java开发中的"六层定位"

很多人以为"用AI写Java"就是把需求扔给AI,等它吐出一堆代码。这是最外行的用法。

我的理解是:AI在Java开发中,扮演了六个不同层级的角色。

text

第一层【翻译官】:把需求/伪代码/其他语言转成Java
第二层【填空题】:写样板代码、CRUD、工具类
第三层【调试器】:分析报错堆栈、找Bug根因
第四层【代码审查员】:指出代码坏味道、安全隐患
第五层【架构顾问】:提供设计思路、选型建议
第六层【文档助手】:写注释、写接口文档、写README

你越清楚自己当前需要哪个层级的"AI角色",Prompt就越精准,AI输出的质量就越高。 下面一个一个来讲。

二、第一层:AI当"翻译官"——把需求变成Java代码

这是最基础、也最常用的场景。但很多人用错了方法——直接说"帮我写个订单系统",AI吐出来的代码根本不能用。

我的标准操作流程:

第一步,把模糊需求变成"结构化输入"。 我一般这样写Prompt:

"我要开发一个订单管理的Java模块,请帮我生成核心代码。
【业务规则】
- 订单状态:待支付→已支付→已发货→已完成,支持取消(仅待支付状态可取消)
- 下单时需校验库存,扣库存失败则订单创建失败
- 支付成功后发送MQ消息通知物流系统
【技术栈】Spring Boot 3.2 + MyBatis-Plus + Redis + RocketMQ
【输出要求】
1. 完整的实体类(含Lombok注解)
2. Service层接口和实现类(核心业务逻辑)
3. Controller层(RESTful API)
4. 枚举类(订单状态)
5. 全局异常处理(业务异常统一封装)
请直接输出代码,不要解释。"

AI十几秒输出了一套完整的代码骨架——Entity、Service、Controller、枚举、异常类全都有了。我需要做的就是补充MyBatis-Plus的Mapper细节和具体的SQL

踩坑提示: AI生成的代码里,业务规则校验(比如状态流转合法性)有时候不完整。比如它可能忘了"已支付状态不能再次支付"这种校验。所以拿到代码后,第一件事就是检查所有ifswitch分支,确保业务规则都覆盖了。

三、第二层:AI当"填空题"——专治各种样板代码

Java开发最耗时的不是写业务逻辑,而是写那些"不写不行、写了又没技术含量"的样板代码。比如:

  • 实体类的getter/setter/toString(虽然Lombok能解决一部分)
  • DTO和Entity之间的转换(BeanUtils.copyProperties还得手动处理嵌套对象)
  • 分页查询的Wrapper构造
  • Excel导入导出的解析逻辑
  • 各种工具类(日期处理、加密解密、文件操作)

这些活,AI干得又快又好。

比如我要写一个DTO转换器,Prompt:

"把OrderEntity转成OrderDTO,字段映射如下:
entity.orderNo → dto.orderNumber
entity.createTime → dto.createdAt(格式化'yyyy-MM-dd HH:mm:ss')
entity.orderItems (List<OrderItemEntity>) → dto.items (List<OrderItemDTO>),需要递归转换
entity.payTime如果为null,dto.payStatus返回'未支付',否则'已支付'
*
写一个Converter工具类,用Java 8 Stream + 函数式编程实现。"

AI输出的Converter类,连null安全的处理都帮我写好了。以前写这种东西要10分钟,现在10秒钟。

四、第三层:AI当"调试器"——专治各种疑难杂症

写了这么多年Java,我见过最恶心的报错是这两类:

第一类:Spring Boot启动失败,报一大串bean依赖循环。

┌─────┐| orderService defined in file [OrderService.class]
↑ ↓
| userService defined in file [UserService.class]
└─────┘

我盯着这个环形依赖看了半天,没理清谁依赖谁。直接复制堆栈扔给AI:

"Spring Boot启动报循环依赖,堆栈如上。帮我分析依赖链,并给出两种以上解决方案。当前代码片段:[粘贴@Autowired相关代码]"

AI秒回:

"依赖链:OrderService → UserService → OrderService(通过OrderService的某个方法间接调用了UserService,而UserService又反向调用了OrderService)。

解决方案一(推荐):在其中一个依赖上使用@Lazy,延迟加载打破循环。
解决方案二:抽取共同依赖的代码到第三个Service中。
解决方案三:重构设计,避免双向依赖(最优但改动大)。

根据你的代码,方案一最简单:在OrderService@Autowired UserService上加上@Lazy即可。"

加了@Lazy,项目秒起。

第二类:空指针地狱。

AI最喜欢干的事就是帮你找出所有可能返回null的地方,然后帮你改成Optional链式调用。我现在的习惯是:写完一段可能涉及多层对象取值的代码,先让AI"扫描"一遍NPE风险

比如这段代码:

java

String city = user.getAddress().getCity().getCityName();

AI会直接标红:

"高危NPE风险: user.getAddress() 可能为null、getCity() 可能为null、getCityName() 可能为null。

建议改用:





java




String city = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .map(City::getCityName) .orElse("未知"); ```"


现在我的代码里,Optional的使用率比一年前高了十倍,NPE相关的线上Bug降了80%。

五、第四层:AI当"代码审查员"——不给同事留喷你的机会

我以前提MR,最怕架构师在评论里写:"这段代码考虑过并发场景吗?""这个异常吞掉是认真的吗?"

现在我学乖了:在提交MR之前,先把代码发给AI审一遍。

我的审查Prompt是:

"请审查以下Java代码,从五个维度输出意见:
1. 空指针风险
2. 线程安全(共享变量、并发集合)
3. 资源泄漏(流、连接是否关闭)
4. 异常处理(是否合理、是否吞异常)
5. 性能问题(循环里查数据库、N+1查询、大对象占用)
按'严重 🔴'、'一般 🟡'、'建议 🟢'分级输出。"

有一次AI审查我的一段"批量导出Excel"代码,指出:

"🟡 一般问题: for循环里每生成一行数据就调用一次workbook.write(),数据量大的时候IO开销很大。建议改为:先在内存中构建完整数据列表,最后一次性写入。"

我改了之后,导出10000条数据的耗时从12秒降到了3秒。这个优化我自己Review的时候根本没意识到。

六、第五层:AI当"架构顾问"——选型、设计、重构一把抓

当你面对一个技术选型或架构决策时,AI的价值甚至比写代码更大。

有一次我要做一个"延迟任务"的功能——用户下单30分钟未支付自动取消。我纠结是用@Scheduled定时扫表,还是用RocketMQ的延迟消息,还是用Redisson的分布式延迟队列。

我把三种方案的优缺点列出来,扔给AI:

"我要实现订单30分钟未支付自动取消,日订单量约10万。三种方案:
A. 定时任务每分钟扫表(@Scheduled)
B. RocketMQ延迟消息(delay level)
C. Redisson RDelayedQueue
*
请帮我做技术选型,从以下几个维度对比:实现复杂度、可靠性、性能、运维成本、扩展性。"

AI输出了一张对比表:

方案

复杂度

可靠性

性能

运维成本

推荐

定时扫表

⭐⭐

⭐⭐(有延迟)

⭐⭐⭐(依赖DB)


不推荐(10万量级扫表太费)

RocketMQ延迟

⭐⭐⭐

⭐⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐

推荐(精准、可靠)

Redisson队列

⭐⭐⭐⭐

⭐⭐⭐

⭐⭐⭐⭐

⭐⭐

备选(无MQ时可考虑)

然后我按AI的建议选了RocketMQ,上线后稳如老狗。

重构场景也一样。 有一次我要重构一个"千年大泥球"类——1500行,十几个方法,各种if-else嵌套。我让AI帮我做"拆分解构":

"这个类有1500行,承担了太多职责。请帮我分析如何拆分,按单一职责原则给出重构方案,用UML类图(Mermaid格式)展示拆分后的类结构。"

AI输出了拆分建议:OrderService → OrderValidator + OrderPriceCalculator + OrderStatusMachine + OrderEventPublisher。还顺便告诉我:"支付逻辑可以抽成策略模式,不同支付渠道(微信/支付宝/银行卡)各自实现。"

我照着改了,代码行数从1500降到了400,可维护性暴涨。

七、第六层:AI当"文档助手"——写注释、写接口文档

Java程序员最讨厌的几件事:写文档、写注释、写README。

但有了AI之后,这事变得无比轻松。

场景一:给一段代码自动生成JavaDoc。

我把一个复杂方法发给AI:

"给这段代码生成标准的JavaDoc注释,包含:功能描述、参数说明、返回值说明、异常说明、使用示例。"

AI输出的JavaDoc:

java

/**
 * 根据订单ID和用户ID查询订单详情,并附带该订单的物流追踪信息
 *
 * @param orderId 订单ID(不能为空)
 * @param userId 用户ID(用于权限校验)
 * @return 订单详情DTO,包含订单基本信息、商品列表、物流信息;如果订单不存在或用户无权访问,返回null
 * @throws IllegalArgumentException 当orderId或userId为null时抛出
 * @throws SecurityException 当用户无权访问该订单时抛出
 *
 * @apiNote 该方法内部调用了订单服务、商品服务和物流服务,会产生3次数据库查询
 * @see OrderService#getBaseOrder(String)
 * @since 2.3.0
 */

以前自己写这种注释要5分钟,现在AI 5秒。

场景二:生成接口文档(Swagger/OpenAPI注解)。

我把Controller方法发给AI:

"为这个接口生成Swagger 3的@Operation和@Parameter注解,包含中文描述、示例值、必填标识、枚举取值范围。"

AI输出了一整套@Schema@ApiResponse注解。前端同事看了直呼专业。

八、AI在Java开发中的三大"致命短板"(血的教训)

短板一:AI不懂你的"私有依赖库"

公司内部的common包、自研的RPC框架、封装的工具类——AI一个都不认识。它生成的代码里,import com.company.common.util.DateUtil 这种内部类,全是红色波浪线

应对方案: 把内部工具类的使用示例作为上下文喂给AI。比如:

"项目中使用了内部工具类DateUtil,用法是DateUtil.formatDate(date, "yyyy-MM-dd")。请基于此生成后续代码。"

短板二:AI对事务边界和锁粒度的判断经常不准

AI知道@Transactional,但它不知道你的业务里哪些操作应该在一个事务里、哪些应该拆分。它也不知道ReentrantLock应该锁在哪个粒度——锁太粗性能差,锁太细会出并发Bug。

应对方案: 涉及事务和锁的代码,AI只能提供"参考实现",最终的事务边界和锁粒度必须由熟悉业务的技术负责人把关。

短板三:AI会"幻视"不存在的API

Java的版本迭代快,AI的训练数据可能落后。比如它可能会生成java.util.Date.toInstant()(Java 8支持的),但如果你项目是Java 8以下,直接报错。

应对方案: 在Prompt里明确注明:"项目使用Java 11 + Spring Boot 2.7.5,请基于此版本生成代码。" 并且依赖版本号自己从pom.xml里确认

九、我的"终极Java开发Prompt模板",直接复制

经过一年多的实践,这是我压箱底的万能Java开发Prompt模板

markdown

【角色设定】
你是一个有12年Java开发经验的技术专家,精通Spring生态、并发编程、性能调优和系统架构设计。

【项目上下文】
- JDK版本:Java 17
- 框架版本:Spring Boot 3.2.0 / MyBatis-Plus 3.5.3 / Redis 7.0
- 项目模块:[简要描述项目是什么业务]
- 团队规范:[比如"使用Lombok、统一返回Result<T>、全局异常用@ControllerAdvice"]

【任务描述】
[具体要做什么:比如"实现一个订单状态变更的Service方法"]

【业务规则】
1. [规则1:比如"只有待支付状态的订单才能取消"]
2. [规则2:比如"取消订单需要释放库存"]
3. [规则3:比如"取消后发送MQ通知"]


【输出要求】
- 直接输出完整的、可运行的Java代码
- 包含必要的import语句
- 关键业务逻辑添加注释
- 异常情况要有明确的处理逻辑
- 如果涉及外部依赖,标注出需要引入的jar包

【约束条件】
- 不使用`Thread.sleep()`作为等待手段
- 不捕获异常后什么都不做(禁止空catch)
- 不使用过时的API(如Date的大部分方法)
- 数据库操作必须用MyBatis-Plus的Wrapper,不拼接SQL字符串

--- 以下是相关代码/上下文 ---
[粘贴现有的相关代码、表结构、接口定义等]

十、最后说两句(掏心窝子版)

回到开头那个问题——"我是不是躺平了?"

我想说的是:这不是躺平,这是进化。

十年前,一个Java程序员的价值体现在"会写多少种设计模式""能背多少API""手写SQL有多快"。现在,这些东西AI全都会。

那Java程序员的真正价值在哪?

在于"判断AI写的代码对不对""把模糊的业务需求翻译成精确的指令""在AI给的三个方案里选出最适合当前场景的那个""在AI忽略的边缘case上做兜底"

AI让"写代码"这件事的难度从"创造"降级到了"修改"。你的注意力应该从"怎么写"上升到"什么是对的""什么是最好的"。

用AI写Java,不是让你变懒,是让你把精力从低价值的"敲键盘"挪到高价值的"做决策"上。

最后送你一句话:

"未来的Java程序员,不是被AI取代的人,而是会用AI取代'重复劳动'的人。"

举报
0 条评论