• Android限制参数传递之StringDef注解的使用


    1. 引言

    参数传递时,如果你想限制传入的参数只能是特定的几个值,该怎么做呢?
    除了把参数类型定义为枚举值,还可以使用注解来限制参数只能是你规定的几个值。以下3个注解就是起到了这样的作用:

    • @StringDef 限制参数只能是规定的几个String类型的值
    • @IntDef 限制参数只能是规定的几个Int类型的值
    • @LongDef 限制参数只能是规定的几个Long类型的值

    2. 注解 @StringDef

    @StringDef: 限制参数只能是规定的几个String类型的值。它作用到注解身上,接收你规定的几个字符串作为特定的值。

    2.1 举例

    在Java中,自定义注解 @ServiceName 来表示想要获取的系统服务的名字👇。

       @Retention(SOURCE)
       @StringDef({
            "power",
            "window",
            "layout_inflater"
       })
       public @interface ServiceName {
       } 
    

    上面代码声明了 @ServiceName 注解,并且限制了被该注解修饰的参数只能是 “power”、“window”、“layout_inflater”。

    接下来使用该注解,发挥作用!
    比如,封装一个获取系统服务的方法,传入的参数为系统服务的名字。

       public Object getSystemService(@ServiceName String name) {
    		// 省略...获取服务
       }																																										
    

    外界在调用的时候,由于 String name 前面有@ServiceName 的修饰,因此只能传入 "power"、"window"、"layout_inflater" 这几个字符串。

    否则的话,就会提示报错:👇
    报错
    包错信息已经很明显:传入的参数必须是 "power"、"window"、"layout_inflater"其中之一。


    2.2 @StringDef源码解释

    从 @StringDef 的源码也可以看出它的作用,下面是源码:👇

    /**
     * Denotes that the annotated String element, represents a logical
     * type and that its value should be one of the explicitly named constants.
     * 

    * Example: *

    
     *  @Retention(SOURCE)
     *  @StringDef({
     *     POWER_SERVICE,
     *     WINDOW_SERVICE,
     *     LAYOUT_INFLATER_SERVICE
     *  })
     *  public @interface ServiceName {}
     *  public static final String POWER_SERVICE = "power";
     *  public static final String WINDOW_SERVICE = "window";
     *  public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
     *  ...
     *  public abstract Object getSystemService(@ServiceName String name);
     * 
    */
    @Retention(SOURCE) @Target({ANNOTATION_TYPE}) public @interface StringDef { /** Defines the allowed constants for this element */ String[] value() default {}; /** * Whether any other values are allowed. Normally this is * not the case, but this allows you to specify a set of * expected constants, which helps code completion in the IDE * and documentation generation and so on, but without * flagging compilation warnings if other values are specified. */ boolean open() default false; }

    上文1.1 的举例,也是来源于源码注释中的举例。

    3. 其他类似注解 @IntDef、@LongDef

    与 @StringDef 注解类似,作用都是限制参数传递时,指定特定的几个值,防止外界传入不合理的值。区别是修饰的类型的不同,@IntDef、@LongDef分别代表了 Int 和 Long 类型。

    这样在编译的阶段就能发现错误,而不是到运行时才出现预期之外的错误。

    4. 总结

    使用注解 @StringDef、@IntDef、@LongDef可以限制参数只能是规定的几个值,防止外界传入不合理的值。

    这种用法是规范编程的体现,可以尝试用起来,让你的代码看起来专业而优雅。

    感谢支持~

  • 相关阅读:
    【开源】基于Vue和SpringBoot的快乐贩卖馆管理系统
    基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
    跨平台音频播放库
    Flask自学分享
    微信小程序 选择学期控件 自定义datePicker组件 不复杂
    Java二十三种设计模式-观察者模式(15/23)
    Linux--进程--进程-父进程退出
    【算法-贪心】无重叠区间-力扣 435 题
    作为一名大学生,需要什么?前辈真实经历
    如何使用腾讯云轻量应用服务器以及WordPress搭建个人博客(详细图文教程)
  • 原文地址:https://blog.csdn.net/fxjzzyo/article/details/139351653