常用注解@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 }