任何人都可以详细解释这条规则。规则:AccessorMethodGeneration优先级:3使用自动生成的方法来访问内部/外部类的私有字段和方法,并使用字段和方法的具体示例?
答案 0 :(得分:2)
AccessorMethodGeneration 规则的PMD documentation provides a summary,重点强调:
从其他类访问私有字段/方法时, Java 编译器将使用package-private生成一个访问器方法 能见度。这会增加开销,并且会增加dex方法的开销 Android系统。通过改变可见性可以避免这种情况 从私有到包私有的字段/方法。
因此,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
}
}
}
和here is an SO example编译器将自动生成代码以访问私有方法。请注意海报的评论(加上我的重点):
编译器获取内部类并将它们转换为顶级类 类。 由于私有方法仅适用于内部类 编译器必须添加新的"合成"有包的方法 级别访问,以便顶级类可以访问它。
总之,PMD标记了代码,在某些情况下,您可以通过修改对私有成员和私有方法的访问来改进性能(我认为通常会非常小)。
值得注意的另一点是,有一些关于 AccessorMethodGeneration 的PMD错误报告无法正常工作(例如https://github.com/pmd/pmd/issues/274和https://github.com/pmd/pmd/issues/342)。因此,如果您无法理解为什么PMD使用 AccessorMethodGeneration 警告标记您的代码,请检查错误报告。