zoukankan      html  css  js  c++  java
  • Java学习 使用注解将参数的值限定

    前言

      在Java的开发中,我们经常需要输入一些int或者String类型的值,而这些值可能仅仅用于代表状态或者类别。但是我们只希望这个参数的值输入0 到 5 这个范围的值,如果多输入大了我们的代码上并没有定义这些大于这些值的操作。 所以我们需要进行限制。 一般情况下我们可以使用枚举enum。 但是,个人经常在折腾Android开发,而Android并不推荐使用enum,因为特别容易activity被持有导致内存泄漏。 所以,我们只能参考用注解的方式限定一些值。

    代码部分

    方式1 :

      比较推荐使用这个方式

      首先创建一个接口设置一些常量,我们将限定只使用这个接口里的值:

    public interface Level {
        int LEVEL_V = 1;
        int LEVEL_D = 2;
        int LEVEL_I = 3;
        int LEVEL_W = 4;
        int LEVEL_E = 5;
    }

      然后创建注解类,使用@IntDef

    //@Retention表示这个注解保留的范围,SOURCE=注解将被编译器编译的时候丢弃,不在代码运行时存在,这个注解只是希望IDE警告限定值的范围并不需要保留到VM或者运行时
    @Retention(SOURCE) 
    //@Target 这个注解需要使用的地方 PARAMETER=注解将被使用到方法的参数中
    @Target({PARAMETER}) 
    //显式声明被定义的整数值,除了@IntDef还有@LongDef @StringDef等等
    @IntDef(value = {Level.LEVEL_V, Level.LEVEL_D, Level.LEVEL_I, Level.LEVEL_W, Level.LEVEL_E}) 
    public @interface LogLevel {
    
    }

      然后使用我们创建的这个LogLevel注解

    public void setLogLevel(@LogLevel int level){
            this.level = level;
    }

      然后我们看看效果,我们这里随便输入一个整数值,可以看到Android studio 已经警告了,告诉我们只能在下面的值中选择。

      输入正确后就没有提示警告了。

    方式2 :

      这是一个更简单暴力的方式,直接在注解里写入常量,因为注解类本身其实也是一个接口。然后声明自己的常量

    @Retention(SOURCE) 
    @Target({PARAMETER})
    @IntDef(value = {LogLevel.LEVEL_V, LogLevel.LEVEL_D, LogLevel.LEVEL_I, LogLevel.LEVEL_W, LogLevel.LEVEL_E})
    public @interface LogLevel {
        int LEVEL_V = 1;
        int LEVEL_D = 2;
        int LEVEL_I = 3;
        int LEVEL_W = 4;
        int LEVEL_E = 5;
    
    }

    end

  • 相关阅读:
    数据库常用操作命令以及explain执行计划
    spring中父子容器
    为什么SpringCloud引导类不加@EnableDiscoveryClient也可以注册到eureka中
    使用dubbo的注解,AOP配置xml的方式无法开启事务
    Excel导出打印失败报错 (eg HSSF instead of XSSF)
    0317 ajax
    0316 事务
    0316 DBUtils
    0315 el技术和jstl技术 javaEE开发模式
    0313 jsp
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/12162036.html
Copyright © 2011-2022 走看看