【发布时间】:2018-05-07 03:12:45
【问题描述】:
谁能详细解释一下这条规则。规则:AccessorMethodGeneration 优先级:3 避免使用自动生成的方法来访问私有字段和内部/外部类的方法,并提供字段和方法的具体示例?
【问题讨论】:
标签: pmd
谁能详细解释一下这条规则。规则:AccessorMethodGeneration 优先级:3 避免使用自动生成的方法来访问私有字段和内部/外部类的方法,并提供字段和方法的具体示例?
【问题讨论】:
标签: pmd
AccessorMethodGeneration 规则的PMD documentation provides a summary,我强调的是:
当从另一个类访问私有字段/方法时,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
}
}
}
还有here is an SO example,编译器将自动生成代码以访问私有方法。注意张贴者的评论(我的重点已添加):
编译器获取内部类并将它们转换为顶级 类。 因为私有方法只对内部类可用 编译器必须添加具有包的新“合成”方法 级别访问,以便顶级类可以访问它。
总之,PMD 正在标记代码,您可以在某些情况下通过修改私有成员和私有方法的访问来提高性能(我认为这通常是非常小的)。
还有一点值得注意的是,有一些关于 AccessorMethodGeneration 无法正常工作的 PMD 错误报告(例如 https://github.com/pmd/pmd/issues/274 和 https://github.com/pmd/pmd/issues/342)。因此,如果您不明白为什么 PMD 会使用 AccessorMethodGeneration 警告标记您的代码,请查看错误报告。
【讨论】: