@@ -766,69 +766,6 @@ public class Foo {
766766 </example >
767767 </rule >
768768
769- <rule name =" InitializeComparatorOnlyOnce"
770- language=" java"
771- message=" Avoid creating Comparator instances repeatedly. Initialize them as static final fields instead."
772- class=" net.sourceforge.pmd.lang.rule.xpath.XPathRule" >
773- <description >
774- Creating Comparator instances repeatedly in methods like compareTo or sort calls is inefficient.
775-
776- Solution: Initialize the Comparator once as a static final field and reuse.
777- </description >
778- <priority >2</priority >
779- <properties >
780- <property name =" xpath" >
781- <value >
782- <![CDATA[
783- //MethodCall[
784- (pmd-java:matchesSig('java.util.Comparator#comparing(_*)')
785- or pmd-java:matchesSig('java.util.Comparator#comparingInt(_)')
786- or pmd-java:matchesSig('java.util.Comparator#comparingDouble(_)')
787- or pmd-java:matchesSig('java.util.Comparator#comparingLong(_)')
788- or pmd-java:matchesSig('java.util.Comparator#nullsFirst(_)')
789- or pmd-java:matchesSig('java.util.Comparator#nullsLast(_)')
790- or pmd-java:matchesSig('java.util.Comparator#reversed()')
791- )
792- (: not chained: AST is backwards with first call last element :)
793- and not(MethodCall[pmd-java:typeIs('java.util.Comparator')])
794- (: not used as argument to another Comparator method :)
795- and not(parent::ArgumentList/parent::MethodCall[
796- pmd-java:typeIs('java.util.Comparator')
797- ])
798- (: used in non-static-final way :)
799- and not(ancestor::FieldDeclaration[pmd-java:modifiers() = ('final') and pmd-java:modifiers() = ('static')])
800- ]
801- ]]>
802- </value >
803- </property >
804- </properties >
805- <example >
806- <![CDATA[
807- public class BadPerson implements Comparable<Person> {
808- @Override
809- public int compareTo(@NotNull Person o) {
810- return Comparator.comparing(Person::getFirstName) // Bad: Creates new Comparator instance on each invocation
811- .thenComparing(Person::getLastName)
812- .thenComparingInt(Person::getAge)
813- .compare(this, o);
814- }
815- }
816-
817- public class GoodPerson implements Comparable<Person> {
818- private static final Comparator<Person> COMPARE_FIRST_LAST_NAME_AGE =
819- Comparator.comparing(Person::getFirstName)
820- .thenComparing(Person::getLastName)
821- .thenComparingInt(Person::getAge);
822-
823- @Override
824- public int compareTo(@NotNull Person o) {
825- return COMPARE_FIRST_LAST_NAME_AGE.compare(this, o); // Good: Comparator initialized once as static final field
826- }
827- }
828- ]]>
829- </example >
830- </rule >
831-
832769 <rule name =" AvoidCommonPoolForBlockingCalls"
833770 language=" java"
834771 message=" Avoid the ForkJoinPool::commonPool used in parallelStream for blocking calls"
0 commit comments