以前沒太關注也沒有在日常開發中使用注解。
最近看了一些“別人家的”代碼,發現注解用的挺好的,尤其是SDK的開發中可以使用注解對代碼做一些約束,不僅能提高編碼效率,還能提高代碼的可讀性和約束性。下面主要舉幾個使用場景。
1. 仿枚舉寫法
眾所周知,Java中的枚舉在內存敏感的環境下是不建議使用的(Android 中的 Enum 到底占多少內存?),所以Google提供了@StringDef和@IntDef來做一個仿枚舉的效果。
Talk is cheap, show me the fucking code.
//用戶信息中有個用戶狀態的屬性,取值有兩種
public static final String STATUS_VALID="VALID";
public static final String STATUS_INVALID="INVALID";
//聲明一個可取值為STATUS_VALID和STATUS_INVALID的枚舉類型。
//RetentionPolicy.SOURCE標記新的注解只在源碼生效
@Retention(RetentionPolicy.SOURCE)
@StringDef({
STATUS_VALID,
STATUS_INVALID
})
public@interfaceUserStatusEnum{}
//使用新注解
private@UserStatusEnumStringstatus;
publicvoidsetStatus(@UserStatusEnumStringstatus){
this.status=status;
}
如果賦值不對,則會提示:
2. 資源注解
在Android中所有ResourceId都是int類型,有些用ResourceId做參數的地方因為沒有任何限制所以可能傳入的int值不是合法的ResourceId。So, Android支持通過注解限制ResourceId。
比如下面的例子:
無注解:
使用注解:
@Override
publicvoidsetContentView(@LayoutResintlayoutResID){
super.setContentView(layoutResID);
unbinder=ButterKnife.bind(this);
}
這樣調用方,如果直接傳int參數就會提示異常嘍:
Android中支持的資源文件注解:
AnimRes AnimatorRes AnyRes ArrayRes AttrRes BoolRes ColorRes DimenRes DrawableRes FractionRes IdRes IntegerRes InterpolatorRes LayoutRes MenuRes PluralsRes RawRes StringRes StyleRes StyleableRes TransitionRes XmlRes
3. 一些零散又實用的注解
@Nullable, @NonNull 這是編譯器常提示的倆注解了,主要是幫助做一些空值的判斷。
@CheckResult
用這個注解標記的方法,必須要求有返回值處理。
@CallSuper
在父類添加此標簽,強制要求重寫的方法的子類必須調用父類方法。
@Size可以限制String或數組的長度,感覺很有用,不過目前還沒實戰中使用到...
參考文章: