PMD规则访问器方法生成

时间:2018-05-04 12:19:49

标签: pmd

任何人都可以详细解释这条规则。规则:AccessorMethodGeneration优先级:3使用自动生成的方法来访问内部/外部类的私有字段和方法,并使用字段和方法的具体示例?

1 个答案:

答案 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/274https://github.com/pmd/pmd/issues/342)。因此,如果您无法理解为什么PMD使用 AccessorMethodGeneration 警告标记您的代码,请检查错误报告。