Как принудительно внедрить конструктор с помощью checkstyle или PMD?

#java #annotations #guice #checkstyle #pmd

#java #аннотации #guice #checkstyle #pmd

Вопрос:

Я хотел бы принудительно внедрить конструктор в проект GWT с использованием аннотации Guice com.google.inject.Inject , которая либо размещается в полях для внедрения полей, либо в конструкторах для внедрения конструктора.

Проект уже использует checkstyle и PMD.

Afaik, я мог бы просто принудительно внедрить конструктор, запретив аннотацию к полям, однако я не нахожу модуля checkstyle или правила PMD для этого. Я уверен, что я что-то упускаю, потому что это кажется повседневной задачей для инструмента статического анализа кода.

Комментарии:

1. Это простая задача для PMD. Несмотря на то, что для этого нет готового правила, PMD позволяет легко расширять и настраивать. Вы можете создавать свои собственные правила ( pmd.github.io/pmd-6.31.0 /… ), и специально для этого случая правило XPath должно быть тривиальным ( pmd.github.io/pmd-6.31.0 /… )

2. Я предлагал это раньше. Возможно, было бы неплохо создать отдельный репозиторий для правил, внесенных пользователями, на которые другие пользователи могут ссылаться и использовать, который отличался бы от основных правил PMD. Это отличается от экспериментальных правил. Аналогично проверкам sevntu в Checkstyle.

Ответ №1:

Это звучит как хороший кандидат для проверки MatchXpath в Checkstyle. Вы могли бы добавить два модуля в свою конфигурацию следующим образом:

 <module name="MatchXpath">
  <property name="query" value="//VARIABLE_DEF/MODIFIERS/ANNOTATION/IDENT[@text='Inject']"/>
  <message key="matchxpath.match"
                     value="Inject annotation only allowed on constructors."/>
</module>

<module name="MatchXpath">
  <property name="query" value="//METHOD_DEF/MODIFIERS/ANNOTATION[./IDENT[@text='Inject']]"/>
  <message key="matchxpath.match"
                     value="Inject annotation only allowed on constructors."/>
</module>

 

Пример файла java:

 public class Communication {
    @Inject @Named("SMSComms")
    CommunicationMode smsComms;

    @Inject
    public void setEmailCommunicator(@Named("EmailComms") CommunicationMode emailComms) {
        this.emailComms = emailComms;
    }

    @Inject
    public Communication(@Named("IMComms") CommunicationMode imComms) {
        this.imComms = imComms;
    }
}

 

Результат:

 
➜  src java -jar checkstyle-8.40-all.jar -c config.xml Communication.java
Starting audit...
[ERROR] src/Communication.java:2:6: Inject annotation only allowed on constructors. [MatchXpath]
[ERROR] src/Communication.java:5:5: Inject annotation only allowed on constructors. [MatchXpath]
Audit done.
Checkstyle ends with 2 errors.