常用注解@Intdef与@Stringdef

1.优点

  可以代替枚举,静态常量,可以让注解只在代码中存在,编译后就删除,可以省内存。

2.@IntDef

2.1 官网

   https://developer.android.com/reference/kotlin/androidx/annotation/IntDef.html

2.2 java示例

 1     //1.指定注解的保留策略,RetentionPolicy.SOURCE表示只保留源码中,编译时删除。还有CLASS和RUNTIME
 2     @Retention(RetentionPolicy.SOURCE)
 3 
 4     //2.定义int 值 ,
 5     //写法1: flag true表示可以用 MODE_STANDARD|MODE_LIST 或者 MODE_LIST & MODE_TABS 这种方式使用,然并卵 ,默认false
 6     @IntDef(flag = true,value = {MODE_STANDARD, MODE_LIST, MODE_TABS})
 7     //写法2:
 8     //@IntDef({MODE_STANDARD, MODE_LIST, MODE_TABS})
 9 
10     //3.定义注解类型
11     public @interface MODE {
12         int MODE_STANDARD = 1;      //默认是 public static final
13         int MODE_LIST = 2;
14         int MODE_TABS = 4;
15     }
16 
17     //4.使用注解 示例
18     @MODE int getMode()         { return MODE_STANDARD; }
19     void setMode(@MODE int m)   { mode = m; }
20     int mode;
21     void testMode(){
22         int m1 = MODE_LIST;
23         int m2 = getMode();
24         setMode(m1);
25         m2 = getMode();
26 
27         m2 = m1 | MODE_LIST & MODE_TABS ;
28 
29     }

2.3 kotlin示例

 1     //1.指定注解的保留策略,AnnotationRetention.SOURCE表示只保留源码中,编译时删除。还有CLASS和RUNTIME
 2     @Retention(AnnotationRetention.SOURCE)
 3     //2.定义int 值 ,
 4     @IntDef(flag = true, value = [MODE_STANDARD, MODE_LIST, MODE_TABS])
 5     //3.定义注解类型
 6     annotation class MODE {
 7         companion object {
 8             const val MODE_STANDARD   = 1
 9             const val MODE_LIST       = 2
10             const val MODE_TABS       = 4
11         }
12     }
13     //4.使用注解 示例
14     fun resetMode(@MODE m: Int) {
15         mode = m
16     }
17     var mode: Int = 0
18 
19     fun testMode() {
20         val m1 = MODE_LIST
21 
22         resetMode(m1)
23 
24         var m2 = m1 or (MODE_LIST and MODE_TABS)
25 
26     }

3.@StringDef

3.1 官网

 https://developer.android.com/reference/androidx/annotation/StringDef.html?hl=en

3.2 java示例

 1     //1.指定注解的保留策略,RetentionPolicy.SOURCE表示只保留源码中,
 2     @Retention(RetentionPolicy.SOURCE)
 3 
 4     //2.定义string值 ,它必需在 注解类型 前。
 5     @StringDef({CMD_A8, CMD_E5, CMD_H3})
 6 
 7     //3.定义注解类型,
 8     public @interface CMD {
 9         public static final String CMD_A8 = "A8";
10         public static final String CMD_E5 = "E5";
11         public static final String CMD_H3 = "H3";
12     }
13     //4.使用
14     void sendData(@CMD String cmd,String data){
15         //... connect socket ,
16         // socket.send
17     }
18     //5.测试
19     void testStringDef(){
20         //sendData("cmd","data");//error ,"cmd"不是 定义的那几个值中的一个。
21         sendData(CMD_A8,"hello");
22     }

3.3 kotlin示例

 1     //1.指定注解的保留策略,AnnotationRetention.SOURCE表示只保留源码中,
 2     @Retention(AnnotationRetention.SOURCE)
 3     //2.定义string值 ,它必需在 注解类型 前。
 4     @StringDef(A8,E5,H9)
 5     //3.定义注解类型,
 6     annotation class CMD {
 7         companion object {
 8             const val A8   = "A8"
 9             const val E5   = "E5"
10             const val H9   = "H9"
11         }
12     }
13 
14     //4.使用
15     fun sendData(@CMD cmd: String, data: String) {
16         //... connect socket ,
17         // socket.send
18     }
19 
20     //5.测试
21     fun testStringDef() {
22         sendData("cmd","data");//error ,"cmd"不是 定义的那几个值中的一个。
23         sendData(A8, "hello")
24     }

 

posted @ 2015-05-22 23:06  f9q  阅读(4689)  评论(0编辑  收藏  举报