Reputation: 49
Can anyone explain bit in detail about this rule. Rule:AccessorMethodGeneration Priority:3 Avoid autogenerated methods to access private fields and methods of inner / outer classes with concrete examples for both fields and methods?
Upvotes: 2
Views: 2268
Reputation: 17363
The PMD documentation provides a summary of the AccessorMethodGeneration rule, with my emphasis added:
When accessing a private field / method from another class, the Java compiler will generate a accessor methods with package-private visibility. This adds overhead, and to the dex method count on Android. This situation can be avoided by changing the visibility of the field / method from private to package-private.
So PMD is advising you that if you make such members and methods package-private instead of private you will avoid the overhead of having to access them through compiler generated accessor methods. (I'm not an Android developer so I can't comment on the "dex method count" issue.)
This is the code example PMD provides with respect to private members:
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
}
}
}
And here is an SO example where the compiler will auto-generate code to access private methods. Note the poster's comment (with my emphasis added):
The compiler takes the inner classes and turns them into top-level classes. Since private methods are only available to the inner class the compiler has to add new "synthetic" methods that have package level access so that the top-level classes have access to it.
In summary, PMD is flagging code where you can make performance improvements (which I would think would usually be very minor) in some scenarios by modifying the access on private members and private methods.
One other point worth noting is that there are some PMD bug reports on AccessorMethodGeneration not working properly (e.g. https://github.com/pmd/pmd/issues/274 and https://github.com/pmd/pmd/issues/342). So if you can't understand why PMD is flagging your code with a AccessorMethodGeneration warning, check the bug reports.
Upvotes: 2