PMD 规则访问器方法生成



谁能详细解释一下这个规则。规则:访问器方法生成优先级:3 避免自动生成访问私有字段的方法和内部/外部类的方法,并提供字段和方法的具体示例?

PMD 文档提供了AccessorMethodGeneration规则的摘要,并强调了这一点:

当从另一个类访问私有字段/方法时,Java 编译器将生成具有包私有的访问器方法 能见度。这会增加开销,并且 dex 方法计数 人造人。这种情况可以通过更改可见性来避免 字段/方法从私有到包私有。

因此,PMD建议您,如果您将这些成员和方法设置为包私有而不是私有,您将避免必须通过编译器生成的访问器方法访问它们的开销。(我不是Android开发人员,所以我无法评论" dex方法计数"问题。

这是 PMD 提供的有关私有成员的代码示例:

public class OuterClass {
private int counter;
/* package */ int id;
public class InnerClass {
InnerClass() {
OuterClass.this.counter++; // wrong accessor method will be generated
}
public int getOuterClassId() {
return OuterClass.this.id; // id is package-private, no accessor method needed
}
}
}

下面是一个 SO 示例,编译器将自动生成代码以访问私有方法。请注意海报的评论(加上我的强调(:

编译器获取内部类并将其转换为顶级类 类。由于私有方法仅适用于内部类 编译器必须添加新的"合成"方法,这些方法具有包 级别访问权限,以便顶级类可以访问它。

总之,PMD 正在标记代码,在某些情况下,您可以通过修改私有成员和私有方法的访问权限来改进性能(我认为这通常是非常小的(。

另一点值得注意的是,有一些关于AccessorMethodGeneration的PMD错误报告无法正常工作(例如 https://github.com/pmd/pmd/issues/274 和 https://github.com/pmd/pmd/issues/342(。因此,如果您不明白为什么 PMD 会用AccessorMethodGeneration警告标记您的代码,请查看错误报告。

最新更新