FindBugs规则整理:Performance
BX_BOXING_IMMEDIATELY_UNBOXED
Primitive value is boxed and then immediately unboxed
对原始值进⾏装箱,然后⽴即取消装箱。这可能是在⼀个未要求装箱的地⽅进⾏了⼿动装箱,从⽽迫使编译器进⾏⽴即撤消装箱的操作
BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COER CION
Primitive value is boxed then unboxed to perform primitive coercion
对原始值进⾏装箱然后⽴即把它强制转换为另外⼀种原始类型。例如:
new Double(d).intValue()应该直接进⾏强制转换例如:(int) d
DM_BOXED_PRIMITIVE_TOSTRING
编制毛衣
Method allocates a boxed primitive just to call toString
仅仅为了调⽤封装类的toString()⽽对原始类型进⾏封装操作。⽐这种⽅法更有效的是调⽤封装类的toString(…)⽅法例如:
new Integer(1).toString() 替换为 String(1)
new Long(1).toString() 替换为 String(1)
new Float(1.0).toString() 替换为 String(1.0)
new Double(1.0).toString() 替换为 String(1.0)
new Byte(1).toString() 替换为 String(1)
new Short(1).toString() 替换为 String(1)
new Boolean(true).toString() 替换为 String(true)
DM_FP_NUMBER_CTOR
Method invokes inefficient floating-point Number constructor; u static valueOf instead
使⽤new Double(double)⽅法总是会创建⼀个新的对象,然⽽使⽤Double.valueOf(double)⽅法可以把值保存在编辑器或者class library、JVM中。使⽤存储值的⽅式来避免对象的分配可以或得更好的代码性能
拿破仑的一生简介除⾮类必须符合Java 1.5以前的JVM,否则请使⽤⾃动装箱或valueOf()⽅法创建Double和Float实例。
DM_NUMBER_CTOR
Method invokes inefficient Number constructor; u static valueOf instead
使⽤new Integer(int)⽅法总是会创建⼀个新的对象,然⽽使⽤Integer.valueOf(int)⽅法可以把值保存在编辑器或者class library、JVM中。使⽤存储值的⽅式来避免对象的分配可以或得更好的代码性能
除⾮类必须符合Java 1.5以前的JVM,否则请使⽤⾃动装箱或valueOf()⽅法创建Long, Integer, Short, Character, Byte实例。
DMI_BLOCKING_METHODS_ON_URL
The equals and hashCode methods of URL are blocking
婴儿多大不吐奶
使⽤equals和hashCode⽅法来对url进⾏资源标识符解析时会引起堵塞。考虑使⽤java.URI来代替。
DMI_COLLECTION_OF_URLS
Maps and ts of URLs can be performance hogs
⽅法或者字段使⽤url的map/t集合。因为equals⽅法或者hashCode⽅法来进⾏资源标识符解析时都会引起堵塞。考虑使⽤java.URI来代
替。
DM_BOOLEAN_CTOR
Method invokes inefficient Boolean constructor; u Boolean.valueOf(...) instead
使⽤new⽅法创建⼀个java.lang.Boolean类型能够的实例对象是浪费空间的,因为Boolean对象是不可变的⽽且只有两个有⽤的值。使⽤Boolean.valueOf()或者Java1.5中的⾃动装箱功能来创建⼀个Boolean实例。
DM_GC
Explicit garbage collection; extremely dubious except in benchmarking code
在代码中显式的调⽤垃圾回收命名,这样做并不能起作⽤。在过去,有⼈在关闭操作或者finalize⽅法中调⽤垃圾回收⽅法导致了很多的性能浪费。这样⼤规模回收对象时会造成处理器运⾏缓慢。
DM_NEXTINT_VIA_NEXTDOUBLE
U the nextInt method of Random rather than nextDouble to generate a random integer
如果r是⼀个java.util.Random对象,你可以使r.nextInt(n)⽣成⼀个0到n-1之前的随机数,⽽不是使⽤(int)(r.nextDouble() * n)
DM_STRING_CTOR
Method invokes inefficient new String(String) constructor
使⽤java.lang.String(String)构造函数会浪费内存因为这种构造⽅式和String作为参数在功能上容易混乱。只是使⽤String直接作为参数的形式
DM_STRING_TOSTRING
Method invokes toString() method on a String
调⽤String()是多余的操作,只要使⽤String就可以了。
DM_STRING_VOID_CTOR
Method invokes inefficient new String() constructor
使⽤没有参数的构造⽅法去创建新的String对象是浪费内存空间的,因为这样创建会和空字符串“”混淆。Java中保证完成相同的构造⽅法会产⽣描绘相同的String对象。所以你只要使⽤空字符串来创建就可以了。
ITA_INEFFICIENT_TO_ARRAY
Method us toArray() with zero-length array argument
当使⽤集合的toArray()⽅法时使⽤数组长度为0的数组作为参数。⽐这更有效的⼀种⽅法是网络宣传
SBSC_USE_STRINGBUFFER_CONCATENATION
Method concatenates strings using + in a loop
在循环中构建⼀个String对象时从性能上讲使⽤StringBuffer来代替String对象
例如:
// This is bad String s = ""; for (int i = 0; i < field.length; ++i) { s = s + field[i]; }三角形的概念
// This is better StringBuffer buf = new StringBuffer(); for (int i = 0; i < field.length; ++i) { buf.append(field[i]); } String s = String();
SS_SHOULD_BE_STATIC
Unread field: should this field be static?
类中所包含的final属性字段在编译器中初始化为静态的值。考虑在定义时就把它定义为static类型的。
UM_UNNECESSARY_MATH
Method calls static Math class method on a constant value
在⽅法中使⽤了java.lang.Math的静态⽅法代替常量来使⽤,使⽤常量速度和准确度会更好。 以下为Math中的⽅法产⽣的值。
Method Parameter abs -any- acos 0.0 or 1.0 asin 0.0 or 1.0 atan 0.0 or 1.0 atan2 0.0 cbrt 0.0 or 1.0 ceil -any- cos 0.0 cosh 0.0 exp 0.0 or 1.0 expm1 0.0 floor -any- log 0.0 or 1.0 log10 0.0 or 1.0 rint -any- round -any- sin 0.0 sinh 0.0 sqrt 0.0 or 1.0 tan 0.0 tanh 0.0 toDegrees 0.0 or 1.0 toRadians 0.0
UPM_UNCALLED_PRIVATE_METHOD
西兰花的做法凉拌
Private method is never called
定义为Private类型⽅法从未被调⽤,应该被删除。
URF_UNREAD_FIELD
Unread field
类中定义的属性从未被调⽤,建议删除。
UUF_UNUSED_FIELD
女性淋病Unud field关爱老人海报
类中定义的属性从未被使⽤,建议删除。
WMI_WRONG_MAP_ITERATOR
Inefficient u of keySet iterator instead of entrySet iterator
当⽅法中接受⼀个Map类型的参数时,使⽤keySet的迭代器⽐使⽤entrySet的迭代器效率要⾼。
DM_BOXED_PRIMITIVE_FOR_PARSING
A boxed primitive is created from a String, just to extract the unboxed primitive value. It is more efficient to just call the static parXXX method.
不需要使⽤封装/反封装来解析⼀个基本类型,使⽤parXXX效率更⾼
其他⽂章(持续更新)
FindBugs:简介与使⽤
FindBugs 规则整理:CORRECTNESS
FindBugs 规则整理:Bad Practice
FindBugs 规则整理:Style & Dodgy
FindBugs 规则整理:Malicious Code Vulnerability
FindBugs 规则整理:Multithreaded Correctness
FindBugs 规则整理:Internationalization
引⽤