1. 程式人生 > 其它 >Code Style issues 中描述的程式碼問題(severity =warning)

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迴圈結束的大括號後等等,此時分號雖然對有效,但是是多餘的,可以將其刪除。