OverrideBothEqualsAndHashCode
? 规则级别:
Error High ? 违规示例代码:
//该AgcDataInfo没有override equals方法 public class AgcDataInfo {
Public AgcDataInfo(String planUnitNo) {
if(planUnitNo!=null)
this.planUnitNo = planUnitNo;
}
//机组名称
String planUnitNo=””; /**
* 生成hash值 */
public int hashCode() {
return this.getPlanUnitNo().hashCode(); }
/**自动生成get,set方法
public String getPlanUnitNo() {
return planUnitNo; }
public void setPlanUnitNo(String planUnitNo) {
if(planUnitNo!=null)
this.planUnitNo = planUnitNo; } }
public void main(String[] args) {
Collection v=new Vector(); Map map=new Hashtable();
AgcDataInfo t1=new AgcDataInfo(“test”); AgcDataInfo t2=new AgcDataInfo(“test”); v.add(t1);
map.put(t1,“test“); map.put(t2,“test“); //false而不是true
System.out.println(v.contains(t2));
//2而不是1
System.out.println(map.size()); }
? 合法代码示例:
public class AgcDataInfo
{
Public AgcDataInfo(String planUnitNo) {
if(planUnitNo!=null)
this.planUnitNo = planUnitNo;
}
//机组名称
String planUnitNo=””; /**
* 比较等式,比较值为下达时间,下达功率,机组名称 */
public boolean equals(Object o) {
if (o instanceof AgcDataInfo) {
AgcDataInfo data = (AgcDataInfo) o;
return his.getPlanUnitNo().equals(data.getPlanUnitNo());
}
return false; }
/**
* 生成hash值 */
public int hashCode() {
return this.getPlanUnitNo().hashCode(); }
/**自动生成get,set方法
public String getPlanUnitNo() {
return planUnitNo; }
public void setPlanUnitNo(String planUnitNo) {
if(planUnitNo!=null)
this.planUnitNo = planUnitNo;
} }
public void main(String[] args) {
Collection v=new Vector(); Map map=new Hashtable();
AgcDataInfo t1=new AgcDataInfo(“test”); AgcDataInfo t2=new AgcDataInfo(“test”); v.add(t1);
map.put(t1,“test“); map.put(t2,“test“); //true
System.out.println(v.contains(t2)); //1
System.out.println(map.size()); } 3.2.6
懒式方式创建对象:不能采用双检查惯用法
? 规范描述:
双检查一般用于c,c++懒式方式获得资源时惯用模式,但在java中该模式是不适用的,因为java创建对象时,先将对象创建后,直接将指针赋予给变量,然后才进行后续的初始化,在初始化这段空白期中,如果另外的线程获得该对象的引用,调用该对象,会产生一些不可预测的结果。 ? PMD规则名称:
DoubleCheckLock
? 规则级别:
Error High ? 违规示例代码 public class Foo { Object baz; Object bar() {
if(baz == null) { //baz may be non-null yet not fully created synchronized(this){ if(baz == null){
baz = new Object(); } } }
return baz; }
}
? 合法代码示例: public class Foo{ Object baz; Object bar() {
synchronized(this){ if(baz == null){
baz = new Object(); } }
return baz; } } 3.2.7
不能在finally中返回值。
? 规范描述:
finally中是必须执行的程序块,如果在里面返回,则表示该方法返回值只能为这个,其他地方返回值可能无效。 ? PMD规则名称:
ReturnFromFinallyBlock
? 规则级别:
Error High ? 违规示例代码:
public int foo(String value) { try {
return Integer.parseInt(value); } catch (Exception e) { return 0;; } finally {
return -1; // Very bad. } }
? 合法代码示例:
public int foo(String value) { int ret=0; try {
ret= Integer.parseInt(value); } catch (Exception e) { ret= 0;
} finally {
//处理其他事宜 ……