1.1 Как установить проверки PMD [...]
PMD хранит конфигурацию правил в специальном репозитории, называемом XML-файлом набора правил. Этот файл конфигурации содержит информацию об установленных в настоящее время правилах и их атрибутах.
Эти файлы находятся в каталоге rulesets
дистрибутива PMD. При использовании PMD с Eclipse проверьте Настройка PMD.
1.2 Обязательно ли следовать этому предупреждающему совету?
A class which only has private constructors should be final
Все конструкторы всегда начинаются с вызова конструктора суперкласса. Если конструктор явно содержит вызов конструктора суперкласса, этот конструктор используется. В противном случае подразумевается конструктор без аргументов. Если конструктор без аргументов не существует или не виден для подкласса, вы получите ошибку времени компиляции.
Таким образом, на самом деле невозможно получить подкласс от класса, каждый конструктор которого является частным. Маркировка такого класса как final
, таким образом, является хорошей идеей (но не обязательной), поскольку она явно предотвращает создание подклассов.
1.3 Что это должно означать?
The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
Сложность - это количество точек принятия решения в методе плюс одна для записи метода. Точки принятия решения - это «если», «пока», «для» и «метки случая». Как правило, 1–4 означает низкую сложность, 5–7 - среднюю сложность, 8–10 - высокую сложность и 11+ - очень высокую сложность.
Сказав это, я просто процитирую некоторые части Aggregate Cyclomatic сложность бессмысленна:
[...] Этот показатель имеет значение только в контексте одного метода. Упоминание о том, что класс имеет цикломатическую сложность X, по сути, бесполезно.
Поскольку цикломатическая сложность измеряет путь в методе, каждый метод имеет цикломатическую сложность как минимум 1, верно? Итак, следующий метод получения имеет значение CCN, равное 1:
public Account getAccount(){
return this.account;
}
Из этого метода буги-вуги ясно, что account
является свойством этого класса. Теперь представьте, что этот класс имеет 15 свойств и следует типичной парадигме получения / установки для каждого свойства , и это единственные доступные методы. Это означает, что у класса есть 30 простых методов, каждый со значением цикломатической сложности 1. В этом случае совокупное значение класса равно 30.
Имеет ли значение это значение, чувак? Конечно, просмотр со временем может дать кое-что интересное; однако, само по себе, как совокупная стоимость, по сути, бессмысленно. 30 для класса ничего не значит, 30 для метода все же что-то значит.
В следующий раз, когда вы обнаружите, что читаете копасетическое совокупное значение цикломатической сложности для класса, убедитесь, что вы понимаете, сколько методов содержит класс. Если совокупное значение цикломатической сложности класса равно 200 - оно не должно вызывать никаких тревог, пока вы не узнаете количество методов. Более того, если вы обнаружите, что количество методов невелико, но значение цикломатической сложности велико, вы почти всегда найдете сложность, локализованную в методе. Право на!
Поэтому мне кажется, что к этому правилу PMD следует относиться с осторожностью (и на самом деле оно не очень ценно).
1.4 А что насчет этого? Я бы хотел изменить это, но в данный момент мне ничего не приходит в голову относительно изменения:
Assigning an Object to null is a code smell. Consider refactoring.
Не уверен, что вы не понимаете об этом.
2.1 Неужели так плохо писать в статическое поле в какой-то момент после его объявления? [...]
Я предполагаю, что вы получаете предупреждение, потому что метод содержит несинхронизированную ленивую инициализацию энергонезависимого статического поля. И поскольку компилятор или процессор могут переупорядочивать инструкции, потокам не гарантируется увидеть полностью инициализированный объект, если метод может быть вызван несколькими потоками. Вы можете сделать поле нестабильным, чтобы устранить проблему.
2.2 [...] Immediate dereference of the result of readLine()
Если больше нет строк текста для чтения, readLine()
вернет null и разыменование, которое вызовет исключение нулевого указателя. Так что вам действительно нужно проверить, является ли результат нулевым.
person
Pascal Thivent
schedule
10.10.2009