Android如何使用注解进行代码检查

移动开发 作者: 2024-08-22 10:30:01
原文首发于微信公众号:躬行之(jzman-blog),欢迎关注交流! Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Co
  1. Nullness注解
  2. 资源注解
  3. 线程注解
  4. 值约束注解
  5. 权限注解
  6. 返回值注解
  7. CallSuper注解
  8. Typedef注解
  9. 可访问性注解

Nullness注解

  • @Nullable :表示可以为 null 的变量、参数或返回值,
  • @NonNull :表示不可为 null 的变量、参数或返回值。
@NonNull
@Override
public View onCreateView(String name,@NonNull Context context,@NonNull AttributeSet attrs) {
    //...
}

资源注解

  • @StringRes: 表示检查是否包含R.string引用
  • @ColorRes: 表示检查是否包含R.color引用
  • @ColorInt: 表示检查是否包含表示颜色的整型
  • @DrawableRes: 表示检查是否包含R.drawable引用
  • @DimenRes: 表示检查是否包含R.dimen引用
  • @InterpolatorRes:表示检查是否包含插值器引用

线程注解

  • @MainThread:表示主线程
  • @UiThread:表示 UI 线程
  • @WorkerThread:表示工作线程
  • @BinderThread:表示Binder线程
  • @AnyThread:表示任何一个线程

值约束注解

  • @IntRange:表示可以验证整型参数是否在指定范围内
  • @FloatRange:表示可以验证浮点型参数是否在指定范围内
  • @Size:表示可以验证集合、数组、字符串参数是否在指定范围内,可指定最大值、最小值以及确切值

权限注解

/**
 * 单个权限检查
 * @param message
 */
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void setMessage(String message) {
}

/**
 * 全部权限检查
 * @param message
 */
@RequiresPermission(allOf = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}

/**
 * 某个权限检查
 * @param message
 */
@RequiresPermission(anyOf = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}

返回值注解

@CheckResult(suggest="#enforcePermission(String,int,String)")
public  int checkPermission(@NonNull String permission,int pid,int uid){
    return 0;
}

当返回值没有被使用,则会建议使用相同功能没有返回值的另一个方法,简而言之,返回值注解 @CheckResult 能够表示某个方法实际使用的时方法本身的处理还是方法最终的处理结果。

CallSuper注解

/**
 * 父类
 * @CallSuper注解的使用
 */
public class Test {
    //使用@CallSuper注解,子类重写该方法时必须调用该方法
    @CallSuper
    protected void onCreate(){
        
    }
}
/**
 * 子类
 * @CallSuper注解的使用
 */
public class TestImpl extends Test{
    @Override
    protected void onCreate() {
        super.onCreate();
        /**
         * 如果不调用父类的方法,则会提示
         * Some methods,such as View#onDetachedFromWindow,require that you also call the super implementation as part of your method.
         */
    }
}

Typedef注解

/**
 * Typedef 注解的定义
 */
public class ActionType {

    public static final int ACTION_TYPE_0 = 0;
    public static final int ACTION_TYPE_1 = 1;
    public static final int ACTION_TYPE_2 = 2;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({ACTION_TYPE_0,ACTION_TYPE_1,ACTION_TYPE_2})
    public @interface ActionTypeDef{

    }
}
/**
 * Typedef注解的使用
 * @param value
 */
private void setValue(@ActionType.ActionTypeDef int value) {
    switch (value) {
        case ActionType.ACTION_TYPE_0:
            break;
        case ActionType.ACTION_TYPE_1:
            break;
        case ActionType.ACTION_TYPE_2:
            break;

//        case 100://不能使用未定义的整型
//            break;
    }
}

可访问性注解

  • @VisibleForTesting:表示注解的某个代码块的可见性高于能够测试时需要的水平
  • @Keep:表示被注解的代码块将不会被混淆。
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_66618.html