1. 程式人生 > >Android--提升程式碼檢查的註解

Android--提升程式碼檢查的註解

摘譯

需要 android.support.annotation, 對應com.android.support:support-annotations:$version (應該都是集成了的,appcompat包含這個庫)
如果在lib中使用,會被打包進AAR, 以xml的形式存在於annotations.zip檔案

註解的相關檢查通過lint處理。lint不強制nullness標籤,只是AS會處理;並且lint的警告並不影響實際編譯

nullness註解

@Nullable,@NonNull(注意是Android的而不是IntelliJ的)
kotlin中,宣告非空的變數無需新增,因為編譯後自動新增
可以使用功能: Analyze > Infer Nullity 檢測是否需要新增

資源註解

BoolRes

AARRGGBB 和 RRGGBB 不屬於@ColorRes, 需要使用@ColorIntger@ColorLong

執行緒註解

值約束 註解

*Range,@Size

setAlpha(@FloatRange(from=0.0, to=1.0) float alpha)

void getLocation(View button, @Size(min=1) int[] location) {
    button.getLocationOnScreen(location);
}

許可權註解

返回值檢查 註解

@CheckResult(suggest="#enforcePermission(String,int,int,String)"
) public abstract int checkPermission(@NonNull String permission, int pid, int uid);

型別定義 註解

//如果TYPE_ONE, TYPE_TWO 可以組合(|,,&, ^ 等),flag = true  
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = false, value = {TYPE_ONE, TYPE_TWO})
public @interface Type {}

keep 註解

使用@Keep註解之後,即使被註解的類或方法沒有被用到,也會被打包

如果是通過反射獲取註解,則在proguard檔案中使用 -if 條件宣告(沒看到過這種用法,文件也沒示例,就提了Dagger和Butterknife,應該是過去式了)

可見性 註解

包括:方法、類、域名、包 ; 和API約束 的第三種效果一樣

//otherwise是指  除了myMethod附屬的其他類
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
void myMethod() { ... }

API約束 註解

//限定子類訪問
@RestrictTo(RestrictTo.Scope.SUBCLASSES)  
//庫範圍訪問
@RestrictTo(RestrictTo.Scope.GROUP_ID)
//測試程式碼訪問
@RestrictTo(RestrictTo.Scope.TESTS)