Правило качества кода для поиска реализаций однопоточных однопотоковых spring

Есть ли правило Checkstyle, PMD или Findbugs, которое может найти следующую реализацию non-threadafe spring singleton?

private String helperVar;

public String getValue(String value) {
   helperVar = value;
   return convertValue();
}

private String convertValue() {
   return helperVar.trim();
}

Я знаю, что этот пример ужасен, но это самый простой способ показать, что я имею в виду.

При выполнении метода getValue из bean за одно исполнение он будет работать нормально. Но при выполнении этого в многопользовательской среде это приведет к непредсказуемым ошибкам/поведению.

Есть ли способ найти эти вхождения без прохождения кода вручную? Есть ли какие-либо статические проверки кода, которые могли бы проверить это и каждый вариант его автоматически?

Ответ 1

Это может быть неприемлемо для вас, но иногда я использую runtime bean отражение для проверки согласованности кода.

Для вашего случая использования я сначала сделаю все мои beans использование constructor на основе инъекций и сделаю все поля участников final. Я считаю, что у findbugs даже есть некоторые неизменные шашки bean.

Во-вторых, чтобы выполнить последовательность кода для вашего варианта использования, я бы использовал либо Spring BeanPostProcessor, либо просто класс, который реализует ApplicationContextAware, а затем проходит ApplicationContext. Теперь вы просто проверяете beans, которые загружаются в контексте приложения, которое является вашим (просто проверьте имя пакета класса beans), чтобы убедиться, что все поля final. Да, вам понадобится более слабый менеджер безопасности или включите вашу политику безопасности, чтобы разрешить отображение частной переменной, но для большинства это не проблема, особенно если вы уже используете что-то вроде спящего режима.

Если есть поле, которое не является окончательным, то есть неверный код, вы просто бросаете исключение, и приложение Spring не запускается.

Для различных исключений из правила вы можете использовать пользовательские аннотации для полей, которые не обязательно должны быть окончательными, или классов, которые должны игнорировать правило.

Вы можете быть обеспокоены производительностью или тем, что встраивание конструктора Spring недостаточно мощное, но Spring уже делает огромное количество отражений в любом случае при загрузке, а инсталляция на основе конструкторов стала довольно сильной в наши дни, так что вы можете даже введите значения владельца места с помощью @Value(${PROP}).

Ответ 2

Вы можете попробовать с помощью

Библиотека FindBugs

У него есть некоторые методы сборки.

Нет точно, что вам нужно, но оно может быть расширено для ваших нужд. Это хороший пример

Блог Даниэля Шнеллера

Общая идея детектора - найти определенные шаблоны в байтекоде класса. Для этого он будет читать файлы .class и помещать их через шаблонные шаблоны, которые реализуются с использованием шаблона посетителя. При чтении он будет вызывать соответствующие методы посетителя, в зависимости от того, какой элемент (метод, объявление поля и т.д.) Под рукой. Написание детектора означает реализацию одного или нескольких из этих методов, создание идеи о том, что класс предназначен для выполнения

Хорошо, что в конце это код Java, который вы можете включить в свой тестовый модуль. Я думаю, вы также можете добавить предупреждение компилятора, но не уверены в этом.