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