Improving Code Inspection with Annotations——使用注解改善代码检查

使用代码检查工具,例如lint,可以帮助你检查问题并改善代码,但是检查工具也就只能推断这么多。例如Android资源id,使用int来标识字符串,图形,颜色和其他资源类型,而检查工具不能告诉你当在需要指定一个颜色的地方你指定了一个字符串资源。这种情况意味着你的应用可能渲染不正确或根本运行失败,即使你使用了代码检查。

注解允许你提供暗示给像lint的代码检查工具,来帮助检测这些更精细的代码问题。它们以元数据标签添加,你可以附在变量,参数,和返回值来检查方法返回值,传递的参数,局部变量和字段。当使用代码检查工具,注解可以帮助你检测像空指针异常和资源类型冲突问题。

关于启用lint检查和运行lint,参考《使用lint改善你的代码》

Android支持大量的注解来插入到代码中的方法,参数和返回值,例如:

  • @Nullable

    可以为空。

  • @NonNull

    不可为空。

  • @StringRes

    引用一个string资源。

  • @DrawableRes

    引用一个Drawable资源。

  • @ColorRes

    引用一个Color资源。

  • @InterpolatorRes

    引用一个Interpolator资源。

  • @AnyRes

    引用任何类型的R.资源。

查看完整的支持的注解列表,要么检查Support-Annotations库的内容,要么使用自动完成特性来显示 import android.support.annotation 语句的可用属性。SDK Manager打包Support-Annotations库到Android Support Repository对于使用Android Studio和到Android Support Library对于使用其他Android开发工具的。

加入注解到代码,首先添加一个Support-Annotations库的依赖。在Android Studio中,在 build.gradle 文件添加依赖。

dependencies {
    compile ‘com.android.support:support-annotations:22.0.0‘
}

Support-Annotations库使用支持的注解装饰,因此使用这个库的方法和资源自动检查代码的潜在问题。

如果你在一个库中包含注解,并使用Android Plugin for Gradle来构建这个库的Android存档,注解会作为存档的一部分以XML格式包含在 annotations.zip 文件。

在菜单选项中选择Analyze > Inspect Code来从Android Studio启动代码检查,Android Studio包含验证注解和自动lint检查。Android Studio在整个代码中显示冲突信息来标识注解冲突和建议可能的解决方案。

添加空判断注解

添加@Nullable和@NonNull注解来检查变量,参数和返回值是否为空。例如,如果包含一个作为参数传递给方法的空值的局部变量有@NonNull注解附在这个参数上,构建代码会生成一个警告标示一个不可为空冲突。

这个例子在 contextattrs 参数附上@NonNull注解来检查传递的参数值不为空。

import android.support.annotation.NonNull;
...
   /** Add support for inflating the <fragment> tag. */
   @NonNull
   @Override
   public View onCreateView(String name, @NonNull Context context,
     @NonNull AttributeSet attrs) {
     ...
   }
...

记住:Android Studio支持运行一个为空性分析来自动推断和在代码中插入空判断注解。

添加资源注解

添加@StringRes注解来检查一个资源参数包含一个R.string引用。在代码检查时,如果这个参数没有传递一个R.string引用,注解会生成一个警告。

因为Android Drawables和R.string资源都以整形传递,所以验证资源类型很有用。代码中期待一个Drawable引用的参数可以被传递一个int类型的引用,但实际上引用的是一个R.string资源。

这个例子附上@StringRes注解到resId参数来验证它真的是一个字符串资源。

import android.support.annotation.StringRes;
...
    public abstract void setTitle(@StringRes int resId);
    ...

其他资源类型的注解,例如@DrawableRes,@ColorRes和@InterpolatorRes也可以用同样注解格式被添加并在代码检查时运行。

创建枚举注解

使用@IntDef和@StringDef注解你可以创建整型和字符串集合的枚举注解来验证其他类型的代码引用,例如传递引用一组常量。

下面的例子示例了创建枚举注解的步骤,来确保传递给方法作为参数的值引用定义的常量中的一个。

import android.support.annotation.IntDef;
...
public abstract class ActionBar {
    ...
    //Define the list of accepted constants
    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})

    //Tell the compiler not to store annotation data in the .class file
    @Retention(RetentionPolicy.SOURCE)

    //Declare the NavigationMode annotation
    public @interface NavigationMode {}

    //Declare the constants
    public static final int NAVIGATION_MODE_STANDARD = 0;
    public static final int NAVIGATION_MODE_LIST = 1;
    public static final int NAVIGATION_MODE_TABS = 2;

    //Decorate the target methods with the annotation
    @NavigationMode
    public abstract int getNavigationMode();

    //Attach the annotation
    public abstract void setNavigationMode(@NavigationMode int mode);

当你构建这个代码,如果 mode 参数没有引用定义的常量的一个(NAVIGATION_MODE_STANDARD,NAVIGATION_MODE_LIST,NAVIGATION_MODE_TABS),会生成一个警告。

你也可以定义一个有flag的注解来检查一个参数或返回值引用合法格式。这个例子用一个合法的DISPLAY_常量列表创建了DisplayOptions注解。

import android.support.annotation.IntDef;
...

@IntDef(flag=true, value={
        DISPLAY_USE_LOGO,
        DISPLAY_SHOW_HOME,
        DISPLAY_HOME_AS_UP,
        DISPLAY_SHOW_TITLE,
        DISPLAY_SHOW_CUSTOM
})
@Retention(RetentionPolicy.SOURCE)
public @interface DisplayOptions {}

...

当你构建含有注解flag的代码,如果被修饰的参数或返回值没有引用合法格式,会生成一个错误。

原文链接:

http://developer.android.com/tools/debugging/annotations.html

本博客会持续对Debug系列的以下文章进行翻译,后面追加链接的为已翻译的:

  1. Debugging——Android应用调试

    http://blog.csdn.net/doandkeep/article/details/45173475

  2. Debugging with Android Studio——在Android Studio中调试

    http://blog.csdn.net/doandkeep/article/details/45219295

  3. Debugging from Other IDEs——在其它IDE中调试

    http://blog.csdn.net/doandkeep/article/details/45243465

  4. Using DDMS——使用DDMS

    http://blog.csdn.net/doandkeep/article/details/45670021

  5. Reading and Writing Logs——读写日志

    http://blog.csdn.net/doandkeep/article/details/45848897

  6. Improving Your Code with lint——使用lint优化代码

    http://blog.csdn.net/doandkeep/article/details/46048733

  7. Optimizing Your UI——优化UI

    http://blog.csdn.net/doandkeep/article/details/46233935

  8. Profiling with Traceview and dmtracedump
  9. Improving Code Inspection with Annotations
  10. Analyzing Display and Performance
  11. Investigating Your RAM Usage
  12. Using the Dev Tools App
时间: 2024-10-06 03:48:27

Improving Code Inspection with Annotations——使用注解改善代码检查的相关文章

java 命名代码检查-注解处理器

命名代码检查 根据 <Java 语言规范( 第 3 版 ) > 中第6.8节的要求, Java 程序命名应当符合下列格式的书写规范: 类 ( 或接口 ) : 符合驼式命名法, 首字母大写. 方法 : 符合驼式命名法,首字母小写 字段 : 类或实例变量 : 符合驼式命名法 , 首字母小写 常量 : 要求全部有大写字母或下划线构成, 并且第一个字符不能是下划线. 要通过注解处理器的API 实现一个编译器插件 , 首先需要了解这组 API 的基本知识.我们实现注解处理器的代码需要继承抽象类 java

Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直到后来android-apt的出现通过注解根据反射机制动态编译生成代码的方式来解决在运行时不再使用发射机制,不过随着android-apt的退出不再维护,我们今天利用Android studio的官方插件annotationProcessor来实现一下自己的ButterKnife UI注解框架. 需

重构与模式:改善代码三部曲中的第三部

一.改善代码的三部曲 <设计模式>-> <重构>-> <重构与模式>.也就是设计->重构->重构出新设计. <设计模式>主要详细说明20几种模式,为我们带来了常见设计问题的经典解决方案,从而改变了整个面向对象开发的面貌.为设计而著. <重构>改善既有代码的设计,总结了我们会用到的各种重构手法,为我们带来了一种改进代码的高效过程,从而彻底改变了面向对象设计的方式.侧重去除坏代码的味道. <重构与模式>是设计模式相

重构改善代码的既有设计

最近在学习重构改善代码的即有设计,虽然在平时的工作学习中有尝试进行重构,但没有清晰的思路往往就是随性而为,以个人的编码风格为准,我们往往知道这样会更好,但是面对编程风格的挑战时,我们往往拿不出准确专业的理论去说服别人遵循这项准则,而我们的想法最终也无疾而终,还是沦落成为个人英雄主义. 此博客不是为了阐述,仅因为还未完全熟练,需时时查看,但是在工作中往往书不在身边,无法翻阅时作为参考: 重新组织函数: Extract Method(提炼函数) Inline Method(内连函数) Inline

使用Android注解来改善代码

昨晚看到一篇好文章.然后是英文的.所以决定翻译分享给大家.这是原文链接:http://www.michaelevans.org/blog/2015/07/14/improving-your-code-with-android-support-annotations/ 假设你还没听说过Android支持注解库,那么你将错过能够帮助你捕获bug的一个轻便灵活的新包. 在这个库中包括了非常多Java的注解,它将帮助Android Studio为了可能出现的错误来检查你的代码,而且反馈通知给你.这个库有

[PY3]——函数——函数注解 | 实现类型检查功能

函数注解(Function Annotations)——> 可以在定义函数的时候对参数和返回值添加注解 写函数注解 #平时我们使用help()可以查看一个函数的说明,我们自己写的函数也可以提供这样的说明 #第一种方式:直接在函数内 '''写文本''' def add(x,y): '''x+y @:param x int @:param y int @return int ''' return x+y #print(help(add)) Help on function add in module

@Data注解简化代码

1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code. 大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁.快速. 2 Lombok使用方法 Lombok能以简单的注解形式来简化java代码,提高开

Hibernate一些_方法[email&#160;protected]注解_代码示例

操作数据库7步骤 :         1 创建一个SessionFactory对象        2 创建Session对象        3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询        4 执行数据保存操作(必须提交,才会执行对应的操作方法)        5 提交事务        6 关闭Session                session.close();                getCurrentS

如何在Code::Blocks下查看程序的汇编代码

学习C语言,Code::Blocks是个不错的IDE.有时候我们需要查看程序的对应的汇编代码,那么Code::Blocks如何才能像vc6.0中那样debug时候查看反汇编代码呢? 首先创建一个工程:Create a new project -> ConsoleApplication -> 填上工程文件名和project路径 -> 调试器和编译器默认. 随便在工程里写点什么代码,比如下面的一个递归代码为例:k7娱乐城 #include "stdio.h" #inclu