我正在使用PMD来分析代码,它会产生一些我不知道如何解决的高优先级警告.
1)Avoid if(x!=y)..; else...;但如果我需要这个逻辑,我该怎么办?也就是说,我确实需要检查一下x!=y?我怎么能重构它?
2)Use explicit scoping instead of the default package private level.但是这个类确实只在包中使用.我应该使用什么访问修饰符?
3)Parameter is not assigned and could be declared final.我应该在PMD用这个警告指出的所有地方添加final关键字吗?
有没有办法告诉PMD忽略检查部分代码是否有重复?
例如,我可以这样做:
// CPD-Ignore-On
...
// CPD-Ignore-Off
Run Code Online (Sandbox Code Playgroud)
目前我使用Maven设置这样的PMD,但是除非我遗漏了什么,否则看不到任何想让我做我想做的事情.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>2.5</version>
<configuration>
<minimumTokens>40</minimumTokens>
<targetJdk>1.5</targetJdk>
<ignoreIdentifiers>true</ignoreIdentifiers>
<ignoreLiterals>true</ignoreLiterals>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud) 我尝试在Java 7项目上使用Sonar(它依赖于新的语法功能),PMD部分和Checkstyle部分无法解析这些文件.
Findbugs部分无法读取Java 7类文件.
这导致Sonar只考虑我班级的10%.
可以有一个解决方法吗?
编辑:Java 7兼容性存在问题.
请投票支持这个问题,所以很快就会修好.
我正在使用PMD为项目生成一些代码质量报告.
我不理解NPath复杂性检查的结果.
我已经创建了一个dull类,它显示了结果(这不是真正的类,但它使用相同的模式):
import java.util.*;
public class SOFExample {
private final Map<String, Date> magicMap = new HashMap<String, Date>();
protected static final long UNKNWOWN = 0L;
private static final class MyCal { long aTime; long bTime; long cTime; long dTime;}
public void usefullMethod(final List<MyCal> myCals) {
final Date a = magicMap.get("a");
final Date b = magicMap.get("b");
final Date c = magicMap.get("c");
final Date d = magicMap.get("d");
final long aTime = a == null ? UNKNWOWN : a.getTime();
final long bTime = …Run Code Online (Sandbox Code Playgroud) 我想在POM中排除单个PMD规则,但它不起作用.我尝试创建一个pmd-exclude.xml(与pom.xml在同一个目录中):
<?xml version="1.0"?>
<ruleset name="remove_rules">
<description>Remove rules</description>
<rule ref="rulesets/unnecessary.xml">
<exclude name="UselessParentheses"/>
</rule>
</ruleset>
Run Code Online (Sandbox Code Playgroud)
来自http://www.ing.iac.es/~docs/external/java/pmd/howtomakearuleset.html并在pom.xml中引用它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<sourceEncoding>utf-8</sourceEncoding>
<rulesets>
<ruleset>${pom.basedir}/pmd-exclude.xml</ruleset>
</rulesets>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但它一直在报告这些规则.
另外:我不想指定它必须检查哪些规则,因为较新版本可以(并且将)包含新规则,我不想检查每个新版本中将运行哪些新规则.
我想知道是否有办法从命令行运行所有PMD规则集.
我使用了与Eclipse IDE和Maven集成的PMD.但现在我需要从CLI运行它.我已经检查了这个页面http://pmd.sourceforge.net/pmd-5.1.0/running.html,它说你可以从CLI运行它,但是使用指定的规则集:
C:\tmp\pmd-bin-5.1.0\pmd\bin>pmd -d c:\data\pmd\pmd\test-data\Unused1.java -f xml -R rulesets/java/unusedcode.xml
Run Code Online (Sandbox Code Playgroud)
在那个例子中,你只是得到Java未使用的代码规则的结果,我正在尝试实现类似的东西:
C:\tmp\pmd-bin-5.1.0\pmd\bin>pmd -d c:\data\pmd\pmd\test-data\Unused1.java -f xml -R rulesets/java/*.xml
Run Code Online (Sandbox Code Playgroud)
并获得Java规则集中所有规则的结果.
Class should define a constructor.
Run Code Online (Sandbox Code Playgroud)
PMD说:
Avoid unnecessary constructors - the compiler will generate these for you.
Run Code Online (Sandbox Code Playgroud)
谁是对的?或者让我们这样说吧 - 在课堂上有一个空的默认ctor有哪些优点和缺点?
我是高级开发人员,所以这对我来说是一个愚蠢的问题.我的回答应该是NO,或者是什么?没有!!!
但我昨天正在开会,我正在解释一些PMD结果.当我们得到"太长的方法名称"问题时,我开始解释并且客户说:好吧,并记住一个长方法名称对性能有影响,程序运行速度较慢.
我说:不,你错了,只是一个干净的代码规则,并且获得一个好的代码很重要,但与性能无关,字节码与不同的名称相似.
但客户,会议中有一些人在此争论,对此肯定.他们有一些项目,因为长的方法名称是导致性能不佳的原因.
我唯一的想法是,一些内省或反思的事情与此有关,但除此之外,我确信,或者我认为我当然,方法名称长度没有任何性能影响.
对此有何想法或建议?
我有以下结构
public class parent {
int value ;
}
public class child extends parent {
int childValue;
public child(){}
public child (int value){
this.childValue = value ; // this line cause ConstructorCallsOverridableMethod warning during object construction
}
}
Run Code Online (Sandbox Code Playgroud)
你能建议如何解决这个错误吗?
我正在通过PMD规则AppendCharacterWithChar.它说避免在StringBuffer.append中将字符串联为字符串.
StringBuffer sb = new StringBuffer();
// Avoid this
sb.append("a");
// use instead something like this
StringBuffer sb = new StringBuffer();
sb.append('a');
Run Code Online (Sandbox Code Playgroud)
我真的需要这个PMD规则吗?以下两段代码之间有很大的性能差异吗?
String text = new StringBuffer().append("some string").append('c').toString();
String text = new StringBuffer().append("some string").append("c").toString();
Run Code Online (Sandbox Code Playgroud) pmd ×10
java ×8
maven ×2
checkstyle ×1
cpd ×1
duplication ×1
java-7 ×1
optimization ×1
performance ×1
profiling ×1
sonarqube ×1
string ×1