1.Call to equals() comparing different type
大部分都是类型永远不会有这种情况 比如a为DOUBLE类型所以EQUALS只匹配字符串 if(a.equals())或if(a.quals())这类判断是根本不会有用的的
2.Class doesn't override equals in superclass
super.equals(obj) 调用父类equals方法 一般都是Object的方法,所以这个super可写可不写,一般都是 为了代码的可读性才加上去的
一般就是重写equals(obj)即可 即public boolean equals(Object obj){ return super.equals(obj);}
但是如果覆盖了equals()方法的话,则必须要覆盖hashCode()方法。否则FINDBUGS会出现下面的7号BUG:覆盖了equals()方法的话,则必须要覆盖hashCode()方法
所以 public boolean equals(Object obj){ return super.equals(obj);}
public int hashCode(){
return super.hashCode();
}
[color=red]此处,借鉴国外的资料:
findbugs: Class doesn't override equals in superclass
This class extends a class that defines an equals method and adds fields, but doesn't define an equals method itself. Thus, equality on instances of this class will ignore the identity of the subclass and the added fields. Be sure this is what is intended, and that you don't need to override the equals method. Even if you don't need to override the equals method, consider overriding it anyway to document the fact that the equals method for the subclass just return the result of invoking super.equals(o).
大概翻译下:
这个类继承了一个定义了(重写了)equals方法并且又增加了字段,但是自己没有定义(重写 override)一个equals方法。
因此,这个类判断实例相等时会忽视掉子类的相等和字类的成员变量值。
你如果确定这就是你想要的,你可以不必重写这个equals方法。尽管你不需要重写equals方法,也要考虑一下重写equals方法,可以这样:子类的equals方法只return 调用
super.equals(0)的结果就行了。[/color]
3.Class is Serializable, but doesn't define serialVersionUID
serialVersionUID 用来表明类的不同版本间的兼容性
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地 相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个 serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。
如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long 的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。
也就是这个错误 你要定义一个名为 serialVersionUID,类型为long的变量 按照新版Eclipse自动填写规则 就是:
private static final long serialVersionUID = 1L;
4.Class names shouldn't shadow simple name of superclass
基本就是这个类的名字跟超类的名字一样但不在一个包里 所以就改下类名啦
5.Comparison of String parameter using == or !=
原因:当比较两个字符串内容是否相同时,仅当两个字符串在源文件中都是常量时或者是使用intern()来比较才可以用==来比较,否则最好使用对象比较方法equal。附 string比较:
String str1 = "java";
String str2 = "java";
System.out.print(str1==str2);
结果:true(二者都为常量)
String str1 = new String("java");
String str2 = new String("java");
System.out.print(str1==str2);
结果:false(二者为对象)
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
结果:false(s不为常量,为对象)
String s1 = "java";
大部分都是类型永远不会有这种情况 比如a为DOUBLE类型所以EQUALS只匹配字符串 if(a.equals())或if(a.quals())这类判断是根本不会有用的的
2.Class doesn't override equals in superclass
super.equals(obj) 调用父类equals方法 一般都是Object的方法,所以这个super可写可不写,一般都是 为了代码的可读性才加上去的
一般就是重写equals(obj)即可 即public boolean equals(Object obj){ return super.equals(obj);}
但是如果覆盖了equals()方法的话,则必须要覆盖hashCode()方法。否则FINDBUGS会出现下面的7号BUG:覆盖了equals()方法的话,则必须要覆盖hashCode()方法
所以 public boolean equals(Object obj){ return super.equals(obj);}
public int hashCode(){
return super.hashCode();
}
[color=red]此处,借鉴国外的资料:
findbugs: Class doesn't override equals in superclass
This class extends a class that defines an equals method and adds fields, but doesn't define an equals method itself. Thus, equality on instances of this class will ignore the identity of the subclass and the added fields. Be sure this is what is intended, and that you don't need to override the equals method. Even if you don't need to override the equals method, consider overriding it anyway to document the fact that the equals method for the subclass just return the result of invoking super.equals(o).
大概翻译下:
这个类继承了一个定义了(重写了)equals方法并且又增加了字段,但是自己没有定义(重写 override)一个equals方法。
因此,这个类判断实例相等时会忽视掉子类的相等和字类的成员变量值。
你如果确定这就是你想要的,你可以不必重写这个equals方法。尽管你不需要重写equals方法,也要考虑一下重写equals方法,可以这样:子类的equals方法只return 调用
super.equals(0)的结果就行了。[/color]
3.Class is Serializable, but doesn't define serialVersionUID
serialVersionUID 用来表明类的不同版本间的兼容性
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地 相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个 serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。
如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long 的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。
也就是这个错误 你要定义一个名为 serialVersionUID,类型为long的变量 按照新版Eclipse自动填写规则 就是:
private static final long serialVersionUID = 1L;
4.Class names shouldn't shadow simple name of superclass
基本就是这个类的名字跟超类的名字一样但不在一个包里 所以就改下类名啦
5.Comparison of String parameter using == or !=
原因:当比较两个字符串内容是否相同时,仅当两个字符串在源文件中都是常量时或者是使用intern()来比较才可以用==来比较,否则最好使用对象比较方法equal。附 string比较:
String str1 = "java";
String str2 = "java";
System.out.print(str1==str2);
结果:true(二者都为常量)
String str1 = new String("java");
String str2 = new String("java");
System.out.print(str1==str2);
结果:false(二者为对象)
String str1 = "java";
String str2 = "blog";
String s = str1+str2;
System.out.print(s=="javablog");
结果:false(s不为常量,为对象)
String s1 = "java";