在Java开发中,注释是代码可读性的重要组成部分。不同于英文注释的天然优势(与编程语言语法同源),中文注释常常面临排版混乱、语义模糊、与代码风格割裂等问题。我见过太多这样的案例:
java复制//获取用户列表 根据状态筛选 分页参数在page对象里
public List<User> getUsers(Status status, Page page) {
// 先查缓存
// 没有再查数据库
// 最后返回
}
这种注释有三个典型问题:1)多意图混杂在一行;2)使用口语化描述;3)与代码结构不同步。优雅的中文注释应该达到三个标准:
文档注释应该聚焦在"为什么"和"怎么用",而不是"做什么"。推荐采用三段式结构:
java复制/**
* 根据状态分页查询用户列表(核心意图)
*
* <p>方法会优先检查本地缓存,当缓存未命中时才会查询数据库。
* 缓存更新采用写穿透策略,过期时间默认为30分钟(实现策略)
*
* @param status 非空状态枚举,传入null将抛出IllegalArgumentException
* @param page 分页对象,pageNo从1开始计数,pageSize最大不超过100
* @return 用户实体列表,当无数据时返回空集合而非null(边界说明)
* @throws IllegalArgumentException 当参数校验失败时抛出
*/
public List<User> getUsers(Status status, Page page) {
// 方法实现
}
关键技巧:
<p>标签分段而非换行,保持HTML渲染效果@param描述应包含null值处理和取值范围好的行内注释应该像代码的"高亮笔",只标记非常规逻辑。对比以下两种写法:
java复制// 不推荐的写法
int discount = price * 0.8; // 计算八折价格
// 推荐的写法
int discount = price * VIP_DISCOUNT_RATE; // VIP专属折扣系数,见配置中心CONFIG_ITEM_123
经验法则:
常见错误包括混用中英文标点、段落间距不一致等。推荐配置IDE的代码风格:
在IntelliJ IDEA中:
Eclipse中通过Window → Preferences → Java → Code Style → Formatter定制
使用Live Templates提高效率:
java复制// 自定义缩写模板
docm -> /**
* $END$
*
* @param $param$
* @return $returns$
* @throws $throws$
*/
配合Alibaba Java Coding Guidelines插件,可以自动检测注释问题:
警告示例:方法【getUser】缺少@param【userId】的注释
通过注释包含测试用例:
java复制/**
* 计算运费(示例可粘贴到JUnit中测试)
*
* // given
* double weight = 5.2; // kg
* String province = "新疆";
*
* // when
* double fee = calculateShipping(weight, province);
*
* // then
* assert fee == 38.5 : "新疆5kg以上运费计算错误";
*/
public double calculateShipping(double weight, String province) {
// 实现逻辑
}
结合Swagger实现API文档同步更新:
java复制@Operation(summary = "获取用户列表", description = "支持按状态筛选")
@ApiResponses(value = {
@ApiResponse(responseCode = "400", description = "参数校验失败"),
@ApiResponse(responseCode = "500", description = "数据库访问异常")
})
public List<User> getUsers(
@Parameter(description = "用户状态枚举", required = true) Status status,
@Parameter(description = "分页参数") Page page) {
// 方法实现
}
日记式注释:
java复制// 2023-01-01 张三修改 修复BUG#123
// 2023-02-15 李四调整 优化性能
应该使用Git提交记录而非代码注释
废话注释:
java复制// 这个方法用来获取用户
public User getUser() {...}
误导性注释:
java复制// 这里不会出现null
obj.toString(); // 实际运行时可能NPE
当中英文注释混编时,建议:
xml复制<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<encoding>UTF-8</encoding>
</properties>
在持续集成中配置检查规则(SonarQube示例):
xml复制<rule>
<key>java:S1604</key> <!-- 文档注释缺失 -->
<severity>MAJOR</severity>
</rule>
<rule>
<key>java:S1168</key> <!-- 空数组应返回预分配对象 -->
<severity>MINOR</severity>
</rule>
最终目标是让代码成为"可执行的文档"。当遇到以下情况时,应该优先重构代码而非增加注释:
需要解释复杂逻辑时 → 提取方法
java复制// 重构前
// 检查是否是有效的管理员:角色为ADMIN且状态为ACTIVE
if (user.getRole() == Role.ADMIN && user.getStatus() == Status.ACTIVE) {...}
// 重构后
if (isValidAdmin(user)) {...}
参数校验逻辑复杂时 → 使用注解校验
java复制// 重构前
public void update(@NotNull User user) {
// 检查user不为null
}
// 重构后
public void update(@Valid @NotNull User user) {...}
魔法数字频繁出现时 → 定义常量
java复制// 重构前
if (status == 3) {...} // 3代表已过期
// 重构后
if (status == OrderStatus.EXPIRED.getCode()) {...}
在实际项目中,我建议采用"注释密度"指标:每100行代码中,文档注释不超过20%,行内注释不超过10%。可以通过SonarQube的Comment Lines Density检查项监控这个比例。