一、
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:
描述: