Code Style issues 中描述的程式碼問題(severity =warning)
技術標籤:Android學習
C-style array declaration
宣告陣列時將中括號放在變數後面時C語言的編寫風格,Java的編寫風格是將中括號放在變數型別後面,示例程式碼如下:
public String test(){
// 以下res1陣列宣告將中括號放在了變數名後,這就是C語言的編寫風格,AS會做warning提示
String res1[] = ...
// 以下res2陣列宣告將中括號放在變數型別String後,這才是正確的Java編寫風格
String[] res2 = ...
}
Class explicitly extends ‘java.lang.Object’
如果該類顯式地宣告繼承自Object類則AS會做warning提示,因為Object是所有類的根,不需要顯式宣告。
Field may be ‘final’
對於唯一地滿足以下要求的欄位可加入final修飾,因為其在之後可能不會再對該欄位內容做出修改;
- 靜態欄位在其宣告時就完成初始化;
- 靜態欄位在一個靜態類的初始化過程中完成初始化;
- 非靜態欄位在其宣告時完成初始化;
- 非靜態欄位在一個非靜態類的初始化過程中完成初始化;
- 非靜態欄位在任一建構函式中完成初始化;
Labeled switch rule has redundant code block
對於switch結構中冗餘的結構可改為使用增強型的switch來令程式碼更加簡潔整齊,如下:
// 以下程式碼AS會提示可使用增強型switch替代。
switch (status) {
case OPEN:
result = 1;
break;
case PROCESS:
result = 2;
break;
case PENDING:
result = 2;
break;
case CLOSE:
result = 3;
break;
default:
throw new RuntimeException("狀態不正確");
}
// 增強型switch,將原本執行結果相同的第二第三個case合併到一起。
switch (status) {
case OPEN -> 1;
case PROCESS, PENDING -> 2;
case CLOSE -> 3;
default -> throw new RuntimeException("狀態不正確");
}
‘List.indexOf()’ expression is replaceable with ‘contains()’
List.indexOf()方法可返回List中傳入值的索引下標,但如果List中不存在該值,則會返回-1,有可能有開發人員想通過判斷返回值是否為-1的方式來判斷當前List中是否含有某一值,因而AS提示此時可以改為使用contains方法直接判斷List中是否含有某一值,該方法直接返回一個Boolean結果,而且執行效率比indexOf更高。
Null value for Optional type
當null被賦值給一個Optional變數,或是null作為返回型別是Optional的方法的返回值,AS就會提示該warning,此時應該使用Optional.empty()替代null。Java8之前訪問物件方法或屬性的呼叫可能發生空指標異常,因此需要顯式地進行空值檢驗,程式碼冗雜,因此引入Optional類改善該問題,倘若還給將null直接賦值給Optional物件,則該類便失去其建立的意義,因而會報warning。
Optional.isPresent() can be replaced with the functional-style expression
當遇到類似"if (Optional.isPresent()) " 時,AS會提示可將其替換為函式式表達,這一部分目前還不理解為什麼需要替換為函式式表達,該判斷常用於與Optional.get配合。
Standard Charset object can be used
需要對字串進行轉碼操作時,可以使用預定義的字符集物件替換,如StandardCharsets.UTF_8,而不是”UTF-8“,這樣程式碼工作效率可能會更高,因為不需要向UTF-8一樣根據編碼在字符集中查詢,而且不需要捕獲UnsupportedEncodingException,可不做try-catch處理。示例如下:
// 以下程式碼會報 Standard Charset object can be used 的warning
String test1 = "hel";
try {
test1.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 以下程式碼不會報warning
String test2 = "hel";
test2.getBytes(StandardCharsets.UTF_8);
Subsequent steps can be fused into Stream API chain
對stream API的轉換執行結果進行檢測,當報該warning時即代表這些轉換過程可直接合併到API呼叫鏈中,這就類似在方法建立一個引用指向返回物件,再return該引用,其實可以直接return 物件。
Type parameter explicitly extends ‘java.lang.Object’
任何型別引數與萬用字元型別引數顯式宣告extend Object時提示warning,道理同上述的”Class explicitly extends ‘java.lang.Object’“
Unnecessary conversion to String
在發生不必要的字串轉換時提示該warning,例如呼叫org.slf4j.Logger的info()、warn()等方法時,String的轉換會自動由底層處理完成,不需要額外呼叫如String.valueOf() 的字串轉換方法。
Unnecessary enum modifier
列舉類上有冗餘修飾符時會提示該warning,示例如下:
// 多出了static修飾符就是報該warning
public static enum Week{
Monday, TuesDay
}
Unnecessary interface modifier
宣告介面時有任何榮譽的修飾符,道理同上述列舉類情況
Unnecessary semicolon
對於不必要存在的分號進行warning,例如類定義後、for迴圈結束的大括號後等等,此時分號雖然對有效,但是是多餘的,可以將其刪除。