当前位置: 首页 > 知识库问答 >
问题:

PMD规则访问器方法生成

谭池暝
2023-03-14

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

共有1个答案

司空坚
2023-03-14

PMD文档提供了AccessorMethodGeneration规则的摘要,并添加了我的重点:

当从另一个类访问私有字段/方法时,Java编译器将生成具有包私有可见性的访问器方法。这增加了开销,并在Android上对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是一种标记代码,在某些情况下,您可以通过修改对私有成员和私有方法的访问来提高性能(我认为这通常是很小的)。

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

 类似资料:
  • 问题内容: 是否有很好的资源来描述PMD规则集背后的“为什么”?PMD的站点具有“什么”(每条规则的作用),但是并未说明PMD为何具有该规则以及为何忽略该规则会使您在现实世界中遇到麻烦。特别是,我很想知道PMD为何具有避免规则In避免(InstantInstantiatingObjectsInLoops和OnlyOneReturn)(如果需要创建一个与集合中每个对象相对应的新对象,则第一个似乎是必

  • 我正在尝试创建一个自定义规则,用于标记void方法中return语句的使用,例如: 我用以下XPath创建了一个自定义XPath规则: 但是当我将此规则导入Eclipse并对代码运行PMD时,它并没有标记我期望的方法,即与上述描述匹配的方法(包含返回的无效方法)。 有人知道这里有什么问题吗?我的XPath有问题吗?或者可能是别的原因? 我使用v3.2.6的插件,其中包含pmd14-4.2.5.ja

  • 我们在Java项目中使用源代码分析器PMD。我正在努力解决报告中的问题,目前正在努力解决规则。我知道这个想法不是为了创建大型类。 然而,我不喜欢“巨大”这个词,因为它太模糊了。有人能解释一下这条规则是如何运作的吗?报告说。 可能的上帝类(WMC=47,ATFD=11,TCC=0.06315789473684211) 这些数字意味着什么?有人知道决定某个特定类是否庞大的公式吗? 这个规则的Javad

  • 在J2EE中,可能无法正常工作。改用。 多少能说明他们在想些什么?这里的“J2EE”环境到底是什么意思?

  • PMD规则如下: 使用合适的类加载器(关键) 在J2EE中,可能无法按预期工作。使用。 你能解释一下他们的想法吗?这里“J2EE”环境的确切含义是什么?

  • 我试图在SonarQube上运行我的自定义PMD规则,但到目前为止,没有成功。 我创建了一个从sonar-pmd-plugin扩展的插件。在这个插件中,我有我的PMD规则集文件(custom_rules.xml)、一个声纳规则文件(pmd-extensions.xml)和我的自定义规则的Java类。 SonarQube识别了我的规则,我已经在默认的质量配置文件中启用了它们。最后,当我在给定的项目上