一、
type : ei_expose_rep
category:malicious_code(恶意程序代码)
描述:may exposeinternal representation by returning getter方法返回引用类型
eclipse自动生成的引用类型(object、数组、date等)的getter、setter方法会得到或通过对可变对象的引用操作而暴露代码内部实现,解决方法很多,只要返回的或赋值的对象不是原引用对象即可。
例如:
以date类型为例:
private java.util.datefirstdate;
publicvoidsetfirstdate(java.util.datevalue) {
this.firstdate =value;
}
public java.util.date getfirstdate(){
returnthis.firstdate;
改为:
public string getfirstdate() {
returnfirstdate;
publicvoidsetfirstdate(stringfirstdate)
{
this.firstdate =firstdate;
二、
type : ei_expose_rep2
描述:may expose internal representation by storing an externallymutable object into setter方法返回引用类型
public java.util.dategetfirstdate() {
publicvoid setfirstdate(stringfirstdate)
三、
type : wmi_wrong_map_iterator
category:performance(性能)
描述:使用keyset迭代器无效,请使用entryset迭代器代替
解释:很多人都这样遍历map,没错,但是效率很低,先一个一个的把key遍历,然后在根据key去查找value,这不是多此一举么,为什么不遍历entry(桶)然后直接从entry得到value呢?它们的执行效率大概为1.5:1(有人实际测试过)。
我们看看hashmap.get方法的源代码:
publicv get(object
key) {
if (key==null)
returngetfornullkey();
inthash=hash(key.hashcode());
for (entry<k,v>
e =table[indexfor(hash,table.length)];e
!=null;e =
e.next) {
object
k;
if (e.hash ==hash&&
((k =e.key) ==
key ||
key.equals(k)))
returne.value;
returnnull;
}
从这里可以看出查找value的原理,先计算出hashcode,然后散列表里取出entry,不管是计算hashcode,还是执行循环for以及执行equals方法,都是cpu密集运算,非常耗费cpu资源,如果对一个比较大的map进行遍历,会出现cpu迅速飚高的现象,直接影响机器的响应速度,在并发的情况下,简直就是一场灾难。
四、
type : se_bad_field_store
category:bad_practice
描述:不可序列化的值存储在一个可序列化类的实例字段中
五、
type : sbsc_use_stringbuffer_concatenation
描述:方法在一个循环中使用“+”运算符拼接字符串
解释:每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低。
六、
type : rv_return_value_ignored_bad_practice
描述:方法忽略异常的返回值
解释:
关于一个方法逻辑执行是否成功,有两种方式:
一种是抛出异常,一种是提供boolean类型的返回值。举一个例子,用户登录,某些人将login方法的返回值定义为int,然后枚举出各个值的含义,比如0代表成功,1代表用户名不存在等等;而有些人,把这些枚举值看成是use case中的异常流,将它们定义为异常对象,遇到“异常”情况直接抛出异常从而实现分支的流程。第一种方式是典型的c语言面向过程风格,
第二种方式,带有强烈的面向对象味道,特别是java提供了checked exception,貌似偏离主题了。
java中很多方法的执行成功依赖于异常的分支实现,但也有提供返回值的实现,比如这里的file.delete方法,上面的写法忽略了返回值(如果调用某个方法却不使用其返回值要特别注意),删除一个文件很可能不成功,但是从代码里并没有看到这一层面的意思。
解决方法:
文件删除不成功该怎么办?现在能处理就处理,现在不能处理就把父类的方法也改成有返回值的,然后向上传递,这跟处理异常的道理是一样的,当然,你也可以把它封装成一个异常对象。
七、
type : obl_unsatisfied_obligation_exception_edge
category:experimental
描述:在处理异常时,方法可能未能成功清理流或资源
八、
type : np_null_on_some_path_exception
category:correctness
描述:方法中的异常路径上的可能的空指针解引用
九、
type : np_load_of_known_null_value
category:style
描述:加载已知为空的值
十、
type : nm_method_naming_convention
描述:方法名应当以小写字母开头
十一、
type : nm_class_naming_convention
描述:类名应当以大写字母开头
十二、
type : eq_doesnt_override_equals
描述:类没有覆盖父类中的equals方法
十三、
type : eq_compareto_use_object_equals
描述:类定义了compareto(...)方法,使用了object.equals()方法
没有使用instanceof判断就直接转型,有抛出classcastexception异常的可能。
这个bug主题是,遵守约定(x.compareto(y)==0) == (x.equals(y)),强烈建议,但不严格要求。
在return 0的时候,调用equals方法返回true,因为在priorityqueue.remove方法中,1.5使用的是compareto方法,而1.6使用的是equals方法,保证环境升级的时候,受影响最小。
在return 0的时候,调用equals方法返回true
十四、
type : dmi_using_removeall_to_clear_collection
描述:不要使用removeall方法清空一个集合
十五、
type : dm_number_ctor
描述:方法调用无效的number构造器,请使用valueof静态方法代替
十六、
type : dm_nextint_via_nextdouble
描述:为了生成一个随机整数,调用random对象的nextint方法,而不是nextdouble方法
十七、
type : dm_boxed_primitive_for_parsing
描述:使用封装/反封装来解析一个基本类型
例如1:
renturnrecord.setparts(integer.valueof(parts[i]));
处理:
renturnrecord.setparts(integer.valueof(parts[i]).intvalue());
十八、
type : dls_dead_local_store
描述:死存储局部向量
十九、
type : bx_unboxing_immediately_reboxed
描述:反封装已经封装的值,然后又立即重新封装
二十、
type : uuf_unused_field
描述:未使用字段
解释:这个警告应该影响不大吧!
type :
category:
描述: