Android--提升程式碼檢查的註解
阿新 • • 發佈:2019-02-18
摘譯
需要 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)