`

[译]深入浅出Android Support Annotations

 
阅读更多

深入浅出Android Support Annotations

@author ASCE1885的 Github  简书 微博 CSDN
原文链接

在Android Support Library19.1版本中,Android工具小组引入了几个很酷的注解类型,供开发者在工程中使用。Support Library自身也使用这些注解,这是一个好兆头。就让我们好好研究下。
通过gradle可以很容易的把这些注解添加到我们的工程中:

compile 'com.android.support:support-annotations:20.0.0'

有三种类型的注解可供我们使用:

  • Nullness注解;

  • 资源类型注解;

  • IntDef和StringDef注解;

我们将通过代码例子来讲解每一种类型的作用以及在工程中如何使用它们。

Nullness注解

使用@NonNull注解修饰的参数不能为null。在下面的代码例子中,我们有一个取值为null的name变量,它被作为参数传递给sayHello函数,而该函数要求这个参数是非null的String类型:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String name = null;

        sayHello(name);
    }


    void sayHello(@NonNull String s) {
        Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
    }

}

由于代码中参数String s使用@NonNull注解修饰,因此IDE将会以警告的形式提醒我们这个地方有问题:

如果我们给name赋值,例如String name = “Our Lord Duarte”,那么警告将消失。使用@Nullable注解修饰的函数参数或者返回值可以为null。假设User类有一个名为name的变量,使用User.getName()访问,那么我们可以编写如下代码:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        User user = new User("Our Lord Duarte");

        Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();
    }

    @Nullable
    String getName(@NonNull User user) {
        return user.getName();
    }

}

因为getName函数的返回值使用@Nullable修饰,所以调用:

Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();

没有检查getName的返回值是否为空,将可能导致crash。

资源类型注解

是否曾经传递了错误的资源整型值给函数,还能够愉快的得到本来想要的整型值吗?资源类型注解可以帮助我们准确实现这一点。在下面的代码中,我们的sayHello函数预期接受一个字符串类型的id,并使用@StringRes注解修饰:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sayHello(R.style.AppTheme);
    }


    void sayHello(@StringRes int id) {
        Toast.makeText(this, "Hello " + getString(id), Toast.LENGTH_LONG).show();
    }

}

而我们传递了一个样式资源id给它,这时IDE将提示警告如下:

类似的,我们把警告的地方使用一个字符串资源id代替警告就消失了:

sayHello(R.string.name);

IntDef和StringDef注解

我们要介绍的最后一种类型的注解是基于Intellij的“魔术常量”检查机制(http://blog.jetbrains.com/idea/2012/02/new-magic-constant-inspection/)
(我们不需要详细了解这个机制具体是如何实现的,想了解的话可以点击链接)。

很多时候,我们使用整型常量代替枚举类型(性能考虑),例如我们有一个IceCreamFlavourManager类,它具有三种模式的操作:VANILLA,CHOCOLATE和STRAWBERRY。我们可以定义一个名为@Flavour的新注解,并使用@IntDef指定它可以接受的值类型。

public class IceCreamFlavourManager {

    private int flavour;

    public static final int VANILLA = 0;
    public static final int CHOCOLATE = 1;
    public static final int STRAWBERRY = 2;

    @IntDef({VANILLA, CHOCOLATE, STRAWBERRY})
    public @interface Flavour {
    }

    @Flavour
    public int getFlavour() {
        return flavour;
    }

    public void setFlavour(@Flavour int flavour) {
        this.flavour = flavour;
    }

}

这时如果我们使用错误的整型值调用IceCreamFlavourManager.setFlavour时,IDE将报错如下:

IDE甚至会提示我们可以使用的有效的取值:

我们也可以指定整型值作为标志位,也就是说这些整型值可以使用’|’或者’&’进行与或等操作。如果我们把@Flavour定义为如下标志位:

@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})
    public @interface Flavour {
    }

那么可以如下调用:

iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager
                .CHOCOLATE);

@StringDef用法和@IntDef基本差不多,只不过是针对String类型而已。

关于将来计划增加哪些新的注解类型或者这些注解的依赖以及和Intellij自身的注解如何交互等等问题,可以查看网址:http://tools.android.com/tech-docs/support-annotations。

分享到:
评论

相关推荐

    深入浅出Android Support Annotation

    ### 深入浅出Android Support Annotation #### 引言 在Android开发过程中,为了提高代码的可读性和维护性,开发者们会采用各种各样的技术手段,其中使用注解是一种非常有效的方法之一。Android Support Library ...

    android-support-annotations.jar.zip

    在本文中,我们将深入探讨Android Support Annotations的核心概念、使用场景以及它如何增强Android应用的开发。 首先,我们来看一下`android-support-annotations.jar.zip`这个压缩包,其中包含的核心文件`android-...

    android-support-v4 .jar,android-support-annotations.jar

    标题提到的"android-support-v4 .jar"和"android-support-annotations.jar"是Android支持库中的两个关键组件。 "android-support-v4 .jar"是Android支持库的v4版本,它是对Android API Level 4(Android 1.6 Donut...

    android.support.annotations.jar

    《深入理解Android支持库:android.support.annotations.jar》 在Android应用开发中,`android.support.annotations.jar`是一个至关重要的组件,它是Google为开发者提供的一种支持库,主要用于解决在Eclipse环境中...

    support-annotations-28.0.0.jar

    support-annotations-28.0.0,自己用的eclipse的jar包,方便用户使用!

    android support 23.2.0

    "Android Support Library"就是为了解决这个问题而推出的,它是一系列库,旨在帮助开发者在多个Android版本上实现一致的行为和特性,无需依赖最新的API。在这个场景中,我们关注的是版本号为23.2.0的兼容包。 **...

    android-support-annotations.jar

    Android官方提供的一个注解库,它提供了许多有用的注解,这些注解的生命周期为源码时期,也就是在编译之后则不再保留,通常用于辅助代码上的静态检查

    support annotations 23.3.0/23.4.0/24.0.0

    gradle编译报错说23.3.3找不到时,把这个包解压放到sdk的extras\android\m2repository\com\android\support\support-annotations即可

    support-annotations.zip

    `support-annotations.zip`是一个包含Android支持库中注解相关类的压缩包,主要用于增强应用程序的功能和可维护性。这个库是从Android Support Library 19.1版本开始引入的,旨在帮助开发者更方便地使用各种注解,而...

    安卓最新com.android.support:support-v4:26.1.0

    安卓最新com.android.support:support-v4:26.1.0-这个算比较新的了

    support-annotations-23.1.0.jar

    support-annotations-23.1.0.jar

    support-annotations-28.0.0.zip

    《Android支持库之Support Annotations详解》 在Android开发中,`support-annotations`是一个至关重要的组件,它提供了丰富的注解,极大地增强了代码的可读性和可维护性。本篇文章将详细解析`support-annotations-...

    android-support-annotations-25.3.1

    android-support-annotations-25.3.1.jar 最近版本jar包,可直接导入使用。

    Android Support Annotations资料整理

    Android Support Annotations 资料整理 Android Support Annotations 是 Android 生态系统中的一种注解机制,旨在帮助开发者编写更加简洁、易读、易维护的代码。下面是 Android Support Annotations 的详细资料整理...

    简单试用Android Annotations

    5. **实际示例**:博主可能给出了一个或多个具体的例子,展示如何使用Android Annotations来编写简洁、清晰的代码,对比传统的Android开发方式,突显其优势。 6. **项目结构**:可能还讨论了使用Android ...

    support-annotations-23.0.1-sources

    support-annotations-23.0.1-sources.jar

    android support v4 v7 v13 v17等集合

    android-support-annotations.jar android-support-v4.jar android-support-v7-appcompat.jar ... android-support-v7-recyclerview android-support-v13.jar

    v7包解决importandroid.support.annotation.RequiresApi

    在Android开发中,`import android.support.annotation.RequiresApi`是一个经常使用的注解,它用于标记一个方法或类,表明这个元素只能在特定版本的Android API级别及以上才能被使用。`v7包`是Android Support ...

Global site tag (gtag.js) - Google Analytics