2014-01-17 1 views
11

Есть ли правило Checkstyle, PMD или Findbugs, которое могло бы найти следующую нелинейную реализацию нитевидной пружины?Правило качества кода для поиска не потокобезопасных синглтонных весенних реализаций

private String helperVar; 

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

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

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

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

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

+0

Идентификатора поля и 'toString' на основе этого поля, называемого последовательно, уже было бы достаточно. Ползет. –

+1

спасибо за попытку помочь мне, но у меня нет проблем с кодом. Я просто хочу найти другие вхождения одного и того же шаблона автоматически, Таким образом, нет никакого вопроса, связанного с образцом кода. Вопрос заключается исключительно в проверках кода. – B4dT0bi

+1

Я не критиковал код, но хотел указать, что ваш шаблон кода, «изменение поля и вычисление с несколькими вхождениями этого поля» _, очень распространен. –

ответ

1

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

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

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

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

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

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

1

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

FindBugs library

Он имеет некоторые сборки в методах.

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

Daniel Schneller blog

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

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