#Android Support Annotationsjava
查看原文android
在Support Library 19.1以及之后的版本中,Android工具小组引入了几个很酷的注解类型,方便开发者在工程中使用,同时Support Library自身也使用了这些注解。ide
本文的代码都使用android studio完成。首先,添加注解支持:工具
compile 'com.android.support:support-annotations:22.1.1'
有三种类型的注解:post
##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 name) { Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show(); } }
因为代码中参数 name 被 @NonNull 注解修饰,所以 android studio 将会以警告的形式提醒咱们这个地方有问题:this
若是咱们给 name 赋值,例如idea
String name = “Our Lord Duarte”
那么警告将消失。code
【注:这个我试了一下,在android studio里面,就算不用注解,也会有提示的,android studio 就是这么智能。】blog
@Nullable 用来修饰方法的参数或者返回值可能为 null。示例以下:
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(this, getName().toLowerCase(), Toast.LENGTH_LONG).show(); } @Nullable String getName() { return ""; } }
由于 getName 方法的返回值使用 @Nullable 修饰,因此 android studio 会提示
Method invocation "getName().toLowerCase()" may produce "java.lang.NollPointerException"
##资源注解
资源类型注解能够帮助咱们准确的使用资源id,例如,避免咱们在要求colorId的地方错误的使用了dimenId。 在下面的代码中,咱们的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,与预期的字符串资源Id不符合,这时IDE将提示警告以下:
相似的,咱们把警告的地方使用一个字符串资源Id代替警告就消失了:
sayHello(R.string.name);
基本上,每一种资源类型都有相应的资源注解
AnimatorRes AnimRes AnyRes ArrayRes AttrRes BoolRes ColorRes DimenRes DrawableRes FractionRes IdRes IntegerRes InterpolatorRes LayoutRes MenuRes PluralsRes RawRes StringRes StyleableRes StyleRes XmlRes
##IntDef和StringDef注解
最后一种类型的注解是基于Intellij的“魔数”检查机制功能
【注:“魔数”就是那些不能看出有什么含义的数字常量,这里也包括字符串常量】
不少时候,出于性能的考虑,咱们会使用整型常量代替枚举类型。例如咱们有一个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类型值而已。
更多信息能够参考tools site
####Android分享 Q群:315658668