【问题标题】:PMD rule Accessor Method GenerationPMD 规则访问器方法生成
【发布时间】:2018-05-07 03:12:45
【问题描述】:

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

【问题讨论】:

    标签: pmd


    【解决方案1】:

    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/274https://github.com/pmd/pmd/issues/342)。因此,如果您不明白为什么 PMD 会使用 AccessorMethodGeneration 警告标记您的代码,请查看错误报告。

    【讨论】:

    • 至于 Android 问题,Android 的 Dalvik VM 以自定义 .dex 格式打包类。 Dex 文件仅限于 64k 字段和 64k 方法。如果需要更多,则将应用程序拆分为 2 个或更多 dex 文件。这种拆分对应用程序启动时间有很大影响,因此最好尽可能避免它(proguard 有很大帮助!)。通过摆脱合成方法来摆脱这个限制非常重要,甚至比消除开销带来的性能优势更重要(因此它是最佳实践规则而不是性能规则)。
    • 根据静态内部类的 cmets:github.com/pmd/pmd/issues/274。此缺陷在 5.5.x 版本中已修复。但是,maven-pmd-plugin 的最新版本是 URL mvnrepository.com/artifact/org.apache.maven.plugins/… 上的 3.9.0。因此,我不确定如何克服这一点。请帮忙?
    • @user3382677 您引用的 3.9.0 版本与 PMD 插件有关,而不是 PMD 本身。如果您查看插件的依赖项,您会看到它提到 PMD 版本 6.x,因此如果问题 #274 在 5.5.x 中得到修复,则不会有问题。只需在 pom.xml 中添加为 maven-pmd-plugin 提供的 XML 作为依赖项,就可以了。
    • org.apache.maven.pluginsmaven-pmd-plugintruetrueutf-8false${project.basedir}/PMDRulesets.xml规则集> pmd-checkprocess-classescheck
    • 我已经添加了上面的一个。在 .m2 中,我可以按预期看到版本“maven-pmd-plugin-3.9.0.jar”,但仍然从 PMD 收到错误,我有静态内部类。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多