#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.