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

4.4 KiB

代码审查报告

文件: 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,应在内部类中访问外部类私有字段。