使用注解代替Enum的使用

之前看到廖神的文章: Android 中的 Enum 到底占多少内存?该如何用?,写的非常好,建议大家都看看。

对于enum占用内存想必大家都知道,那么在Android里面什么时候用enum,什么时候用常量,可以参考这一篇文章:Should I strictly avoid using enums on Android?

那么,对于一些常量,我们想保留类似于enum的约束性,有办法么?

答案是,有的。使用注解。

其实在Android源码中已经有这些使用的场景,比如ViewsetVisibility()方法:

1
2
3
4
@RemotableViewMethod
public void setVisibility(@Visibility int visibility) {
setFlags(visibility, VISIBILITY_MASK);
}

@Visibility点进去看:

1
2
3
@IntDef({VISIBLE, INVISIBLE, GONE})
@Retention(RetentionPolicy.SOURCE)
public @interface Visibility {}

可以看见,这里自定义了一个注解,并使用了@IntDef()注解。@IntDef是在android.support.annotation这个jar包中的。下面用一个例子来具体说明使用方法:

在网络请求中,Http请求方法有好几种,”GET”, “POST”, “PUT”, “DELETE”等等,如果使用注解来代替常量的话,可以这么写:

code2

在需要传入请求方法地方,就可以添加注解来限制:

1
2
3
4
public RequestBuilder setMethod(@RequestMethod String requestMethod){
this.method = requestMethod;
return this;
}

这时候,给setMethod()穿参数时,就只能以RequestMethod.GET这种方式,或者直接传入字符串GET(这样编译会有警告,但可以通过)。

除了@StringDef@IntDef以外,在android.support.annotation包下还有很多其他的注解,比如@ColorRes等等,更多其他用途等你来发现,哈哈。

如果觉得文章对你有帮助,请我喝杯可乐吧