Files
2026Technology-Competition/data/demo-pmd/reports/AccessorDemo-review.md
T

69 lines
4.4 KiB
Markdown

# 代码审查报告
**文件:** `data\demo-pmd\src\com\demo\errorprone\extra\AccessorDemo.java`
**语言:** java
**耗时:** 127.9s
**分析工具:** pmd
---
总计: 16 | 错误: 1 | 警告: 10 | 建议: 5
静态分析 · 12 个问题
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L13
该类只有私有构造函数,应声明为 final。
建议: 将类声明改为 final class AccessorClass,保留私有构造函数,明确禁止继承。
- 🟡 `pmd:CommentDefaultAccessModifier` L17
方法 'create()' 缺少默认访问修饰符的注释。
建议: 在方法前添加 /* default */ 注释,明确表达包级私有访问意图。
- 🟡 `pmd:AtLeastOneConstructor` L22
每个类应至少声明一个构造函数。
建议: 为 AccessorUser 添加显式无参构造函数,例如 AccessorUser() {}。
- 🟡 `pmd:CommentDefaultAccessModifier` L23
方法 'bad()' 缺少默认访问修饰符的注释。
建议: 在方法前添加 /* default */ 注释,明确表达包级私有访问意图。
- 🟡 `pmd:UnusedLocalVariable` L25
避免未使用的局部变量 'a'。
建议: 删除该局部变量声明;如果 create() 的返回值确实是需要的,请先使用它。
- 🟡 `pmd:LocalVariableCouldBeFinal` L26
局部变量 'cg' 可以声明为 final。
建议: 将变量声明改为 final CallerGen cg = new CallerGen();。
- 🟡 `pmd:UnusedLocalVariable` L27
避免未使用的局部变量 's'。
建议: 删除该局部变量声明,或使用 getHidden() 的返回值。
- 🟡 `pmd:AtLeastOneConstructor` L32
每个类应至少声明一个构造函数。
建议: 为 CallerGen 添加显式无参构造函数,例如 CallerGen() {}。
- 🟡 `pmd:ImmutableField` L33
字段 'hidden' 可以被声明为 final。
建议: 将字段改为 private final String hidden = "x";,使字段初始化后不可变。
- 🟡 `pmd:CommentDefaultAccessModifier` L35
方法 'getHidden()' 缺少默认访问修饰符的注释。
建议: 在方法前添加 /* default */ 注释,明确表达包级私有访问意图。
- 🔵 `pmd:UnnecessaryImport` L9
未使用的导入 'java.util.ArrayList'
建议: 删除该 import 语句,避免无效依赖。
- 🔵 `pmd:UnnecessaryImport` L10
未使用的导入 'java.util.List'
建议: 删除该 import 语句,避免无效依赖。
AI 审查 · 4 条建议
- 🟡 [AI] [bug] `dead-method` L23
**bad() 方法无任何可观察行为,疑似调试残留**
bad() 创建了 AccessorClass 和 CallerGen 实例,并调用 getHidden(),但所有局部变量与返回值都被丢弃;方法不会写入状态、打印内容或返回结果,因此调用它没有任何可验证的效果。
建议: 删除该方法;如果它用于演示 getter,应返回 getHidden() 结果或使用断言校验,避免空操作。
- 🔵 [AI] [design] `misleading-comment` L12
**注释与代码行为不一致,示例未触发合成访问器**
第 12 行注释声称代码涉及 AccessorClassGeneration,但 AccessorUser 只是调用 AccessorClass.create(),私有构造函数是在 AccessorClass 自身静态方法内调用,不会生成合成访问器。第 31 行也存在类似问题。这样的示例会误导读者,无法验证对应规则。
建议: 删除或改写相关注释,说明当前代码仅用于触发其他 PMD 规则;如需演示合成访问器,可让内部类访问外部类的私有字段,由编译器生成 synthetic accessor 方法。
- 🔵 [AI] [performance] `stateless-factory-allocation` L17
**AccessorClass 是无状态类,create() 每次调用都分配新实例**
AccessorClass 没有实例字段,每次调用 create() 都会 new 一个无状态对象。若该工厂方法被高频调用,会产生不必要的对象分配与 GC 压力。可改为单例持有唯一实例。
建议: 为 AccessorClass 添加 private static final 实例字段,并在 create() 中返回该实例;若类仅作为命名空间,也可直接使用静态方法。
- 🔵 [AI] [design] `misleading-comment-method-generation` L31
**AccessorMethodGeneration 注释与代码行为不符**
第 31 行注释声称“避免合成访问器方法”,但 getHidden() 是 CallerGen 自身的普通方法,直接读取自己的私有字段;外部类只是调用该 getter,并不会触发编译器生成 synthetic accessor method。
建议: 将该注释改为说明性文字;如需演示 AccessorMethodGeneration,应在内部类中访问外部类私有字段。