PMD와 CheckStyle을 비교 하는 질문 이있었습니다 . 그러나 PMD와 FindBugs의 차이점 / 유사성에 대한 좋은 분석을 찾을 수 없습니다. 중요한 차이점은 PMD는 소스 코드에서 작동하는 반면 FindBugs는 컴파일 된 바이트 코드 파일에서 작동한다는 것입니다. 그러나 기능 측면에서 둘 중 하나를 선택해야합니까, 아니면 서로 보완해야합니까?
PMD와 CheckStyle을 비교 하는 질문 이있었습니다 . 그러나 PMD와 FindBugs의 차이점 / 유사성에 대한 좋은 분석을 찾을 수 없습니다. 중요한 차이점은 PMD는 소스 코드에서 작동하는 반면 FindBugs는 컴파일 된 바이트 코드 파일에서 작동한다는 것입니다. 그러나 기능 측면에서 둘 중 하나를 선택해야합니까, 아니면 서로 보완해야합니까?
답변:
둘 다 사용하고 있습니다. 나는 그들이 서로를 보완한다고 생각합니다.
말했듯이 PMD 는 소스 코드에서 작동하므로 명명 규칙 위반, 중괄호 부족, 잘못된 null 검사, 긴 매개 변수 목록, 불필요한 생성자, 스위치 중단 누락 등과 같은 문제를 찾습니다. PMD는 또한 Cyclomatic에 대해 알려줍니다. 매우 도움이되는 코드의 복잡성 (FindBugs는 Cyclomatic 복잡성에 대해 알려주지 않음).
FindBugs 는 바이트 코드에서 작동합니다. 다음은 FindBugs가 발견하는 몇 가지 문제입니다. 하위 유형에서 equals () 메서드가 실패하고, 복제 메서드가 null을 반환 할 수 있음, 부울 값의 참조 비교, 불가능한 캐스트, 0-31 범위에 있지 않은 양만큼 이동 된 32 비트 정수, 자신을 포함하는 컬렉션, equals 메소드는 항상 true, 무한 루프 등을 반환합니다.
일반적으로 그들 각각은 다른 문제 세트를 찾습니다. 둘 다 사용하십시오. 이 도구는 좋은 Java 코드를 작성하는 방법에 대해 많은 것을 가르쳐주었습니다.
PMD의 가장 좋은 기능은 규칙 디자이너와 함께 번들로 제공되는 XPath 규칙으로 코드 샘플에서 새 규칙을 쉽게 구성 할 수 있습니다 (RegEx 및 XPath GUI 빌더와 유사 함). FindBugs는 기본적으로 더 강력하지만 프로젝트 별 규칙과 패턴을 구성하는 것은 매우 중요합니다.
예를 들어, 2 개의 중첩 된 for 루프와 관련된 성능 문제가 발생하여 O (n ^ 2) 실행 시간이 발생하여 쉽게 피할 수 있습니다. PMD를 사용하여 임시 쿼리 를 생성하고 중첩 된 for 루프의 다른 인스턴스를 검토했습니다-// ForStatement / Statement // ForStatement. 이것은 문제의 두 가지 더 많은 사례를 지적했습니다. 이것은 일반적인 규칙이 아닙니다.