精华内容
下载资源
问答
  • [img=https://img-bbs.csdn.net/upload/202012/05/1607128825_61460.png][/img][img=...这个枚举参数没有在声明或者定义里设置默认值啊?在函数里设置默认值?[face]onion:3.gif[/face]有大佬解说一下吗。
  • spring注入枚举类型作为参数

    万次阅读 2014-04-05 18:17:51
    //定义枚举类型 public enum ReportType { MONTH,WEEK,DAY } //使用枚举类型 public class ReportJob { private ReportType reportType; } //spring配置文件注入 注意: 枚举类型要想注入到...
    //定义枚举类型
    public enum ReportType {
        MONTH,WEEK,DAY
    }
    
    //使用枚举类型
    public class ReportJob {
        private ReportType reportType;
    }
    
    //spring配置文件注入
    <bean id="DAY" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
        	<property name="staticField" value="com.test.ReportType.DAY" />  
    	</bean>
    <bean id="dayReportJob" class="com.test.ReportJob">
    		<property name="reportType" ref="DAY" />
    	</bean>


    注意:

    枚举类型要想注入到类中,一定要先使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean类将枚举类型进行转换,即

    <bean id="DAY" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
        	<property name="staticField" value="com.test.ReportType.DAY" />  
    	</bean>
    将ReportType.Day转换为DAY这个bean,然后在要注入的bean中使用<property name="reportType" ref="DAY" />引用即可。
    展开全文
  • 参考自:... 类型如下: package com.test.dev; public class LOGIN_INFO { public SDK_SNTYPE msn_type; public String msn_str; } package com.test.dev; ...

     

    参考自:https://www.cnblogs.com/bigbensk/p/3631988.html

    类型如下:

    package com.test.dev;
    
    public class LOGIN_INFO {
    
        public SDK_SNTYPE msn_type;
    
        public String msn_str;
    }
    
    
    package com.test.dev;
    
    public enum SDK_SNTYPE {
        SN_EXPLICIT(0),
        SN_FILEPATH(1);
    
        private int value;
    
        SDK_SNTYPE (int value) {
            this.value = value;
        }
    
        public int getValue() {
            return value;
        }
    
    }
    bool ConvertJO2Info(JNIEnv * env, jobject jo, int& val)
    {
    	do{
    		if(jo == NULL || env == NULL )
    		{
    			break;
    		}
    		jclass jCls = env->GetObjectClass(jo);
    
    		if(jCls == NULL)
    		{
    			break;
    		}
    
    		jfieldID jf_sn_type_id = env->GetFieldID(jcls, field_name, "Lcom/test/dev/SDK_SNTYPE;");
    
    		if(jf_sn_type_id == NULL )
    		{
    			break;
    		}
    		jobject jSnTypeObj = env->GetObjectField(jo, jf_sn_type_id);
    
    		if(jSnTypeObj == NULL )
    		{
    			break;
    		}
    
    		jclass jSnTypeCls = env->GetObjectClass(jSnTypeObj);
    
    		if(jSnTypeCls == NULL)
    		{
    			break;
    		}
    
    		jmethodID getVal = env->GetMethodID(jSnTypeCls, "getValue", "()I");
    		val = env->CallIntMethod(jSnTypeObj, getVal);
    
    		return true;
    	}while(false);
    	return false;
    }

     

    展开全文
  • C语言使用枚举类型作为函数参数

    C语言使用枚举类型作为函数参数
    在这里插入图片描述

    展开全文
  • 在我们实际开发中,枚举类型应用十分广泛,可以避免在项目中定义大量的『魔法值』变量。但是,在 web 开发中,如何将枚举对象作为请求参数传进 Controller,做到类型自动转换?直接使用@RequestParam和@Reques...

    https://xkcoding.com/2019/01/30/spring-boot-request-use-enums-params.html

    1. 场景

    在我们实际开发中,枚举类型应用十分广泛,可以避免在项目中定义大量的『魔法值』变量。但是,在 web 开发中,如何将枚举对象作为请求参数传进 Controller,做到类型自动转换?直接使用 @RequestParam 和 @RequestBody 断然是不够的,这里就需要我们自定义 Converter 来实现类型转化了。

    2. 需求

    比如一个用户对象,里面的性别属性,我们定义一个枚举类型 Gender

    GenderEnum.java

    
    /**
     * <p>
     * 性别枚举
     * </p>
     *
     * @package: com.xkcoding.springboottest.constants.enums
     * @description: 性别枚举
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:06
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    @Getter
    public enum GenderEnum {
        /**
         * 男
         */
        MALE(0),
        /**
         * 女
         */
        FEMALE(1);
    
        /**
         * 性别编码
         */
        private Integer code;
    
        GenderEnum(int code) {
            this.code = code;
        }
    
    }

    请求对象封装 QueryRequest

    QueryRequest.java

    
    /**
     * <p>
     * 请求参数
     * </p>
     *
     * @package: com.xkcoding.springboottest.controller.enum_test
     * @description: 请求参数
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 14:02
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    @Data
    public class QueryRequest {
        private GenderEnum gender;
    }

    在 Controller 层直接使用如下方式,期望参数自动进行类型转换

    EnumTestController.java

    
    /**
     * <p>
     * 测试参数是枚举类型,自动转换
     * </p>
     *
     * @package: com.xkcoding.springboottest.controller.enum_test
     * @description: 测试参数是枚举类型,自动转换
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 13:56
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    @Slf4j
    @RestController
    @RequestMapping("/enum")
    public class EnumTestController {
    
        @GetMapping("/get")
        public Dict testGet(QueryRequest request) {
            log.info("【get-request】= {}", JSONUtil.toJsonStr(request));
            return Dict.create().set("get-request", request);
        }
    
        @PostMapping("/post")
        public Dict testPost(@RequestBody QueryRequest request) {
            log.info("【post-request】= {}", JSONUtil.toJsonStr(request));
            return Dict.create().set("post-request", request);
        }
    
    }

    这么写的时候,gender 只能接收到 MALE 、FEMALE 这样的参数,除此以外,均会报类型不匹配的错误信息,此时是无法处理 0 、1 这样的参数的。

    需求:

    1. 接收到 MALE 、FEMALE 这样的参数,可以自动转为对应的枚举值;
    2. 接收到 0 、1 这样的参数,也可以自动转为对应的枚举值。

    3. 解决

    此时,本文的『主角』Converter 就可以隆重登场了。

    注意,Converter 是 org.springframework.core.convert.converter.Converter ,别导错包了。

    IntegerCodeToGenderEnumConverter.java

    
    /**
     * <p>
     * 编码 -> 性别 转换器
     * </p>
     *
     * @package: com.xkcoding.springboottest.config.convert
     * @description: 编码 -> 性别 转换器
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:14
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public class IntegerCodeToGenderEnumConverter implements Converter<Integer, GenderEnum> {
        private Map<Integer, GenderEnum> enumMap = Maps.newHashMap();
    
        public IntegerCodeToGenderEnumConverter() {
            for (GenderEnum genderEnum : GenderEnum.values()) {
                enumMap.put(genderEnum.getCode(), genderEnum);
            }
        }
    
        @Override
        public GenderEnum convert(Integer source) {
            GenderEnum genderEnum = enumMap.get(source);
            if (ObjectUtil.isNull(genderEnum)) {
                throw new IllegalArgumentException("无法匹配对应的枚举类型");
            }
            return genderEnum;
        }
    }

    其实这里已经可以实现类型转换了,但是引出另外一个问题,当我们的枚举类特别多的时候,我们就需要写很多个 自定义的 Converter 来满足类型转化。

    所以我们不使用上面直接使用 Converter 的这种方法,我们引入 ConverterFactory 来解决这个问题。

    3.1. 抽取公共枚举接口

    以后的枚举类都需要实现这个接口

    BaseEnum.java

    
    /**
     * <p>
     * 通用枚举接口
     * </p>
     *
     * @package: com.xkcoding.springboottest.constants
     * @description: 通用枚举接口
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:04
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public interface BaseEnum {
        /**
         * 获取枚举编码
         *
         * @return 编码
         */
        Integer getCode();
    }

    3.2. 调整 GenderEnum 枚举类

    GenderEnum.java

    
    /**
     * <p>
     * 性别枚举
     * </p>
     *
     * @package: com.xkcoding.springboottest.constants.enums
     * @description: 性别枚举
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:06
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    @Getter
    public enum GenderEnum implements BaseEnum {
        /**
         * 男
         */
        MALE(0),
        /**
         * 女
         */
        FEMALE(1);
    
        /**
         * 性别编码
         */
        private Integer code;
    
        GenderEnum(int code) {
            this.code = code;
        }
    
    }

    3.3. 创建通用 Integer -> Enum 的 Converter 类

    IntegerToEnumConverter.java

    
    /**
     * <p>
     * 枚举编码 -> 枚举 转化器
     * </p>
     *
     * @package: com.xkcoding.springboottest.config.convert
     * @description: 枚举编码 -> 枚举 转化器
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:21
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public class IntegerToEnumConverter<T extends BaseEnum> implements Converter<Integer, T> {
        private Map<Integer, T> enumMap = Maps.newHashMap();
    
        public IntegerToEnumConverter(Class<T> enumType) {
            T[] enums = enumType.getEnumConstants();
            for (T e : enums) {
                enumMap.put(e.getCode(), e);
            }
        }
    
        @Override
        public T convert(Integer source) {
            T t = enumMap.get(source);
            if (ObjectUtil.isNull(t)) {
                throw new IllegalArgumentException("无法匹配对应的枚举类型");
            }
            return t;
        }
    }

    3.4. 创建对应的自定义 ConverterFactory 工厂类

    IntegerCodeToEnumConverterFactory.java

    
    /**
     * <p>
     * 编码 -> 枚举 转化器工厂类
     * </p>
     *
     * @package: com.xkcoding.springboottest.config.convert.factory
     * @description: 编码 -> 枚举 转化器工厂类
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:09
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public class IntegerCodeToEnumConverterFactory implements ConverterFactory<Integer, BaseEnum> {
        private static final Map<Class, Converter> CONVERTERS = Maps.newHashMap();
    
        /**
         * 获取一个从 Integer 转化为 T 的转换器,T 是一个泛型,有多个实现
         *
         * @param targetType 转换后的类型
         * @return 返回一个转化器
         */
        @Override
        public <T extends BaseEnum> Converter<Integer, T> getConverter(Class<T> targetType) {
            Converter<Integer, T> converter = CONVERTERS.get(targetType);
            if (converter == null) {
                converter = new IntegerToEnumConverter<>(targetType);
                CONVERTERS.put(targetType, converter);
            }
            return converter;
        }
    }

    3.5. 创建通用 String -> Enum 的 Converter 类和对应的 ConverterFactory 工厂类

    因为 Post 请求可以对传入的 json 属性定义类型,但是 Get 请求后台接收到的参数都是 String 类型,因此需要在创建一个 Converter 类

    StringToEnumConverter.java

    
    /**
     * <p>
     * 枚举编码 -> 枚举 转化器
     * </p>
     *
     * @package: com.xkcoding.springboottest.config.convert
     * @description: 枚举编码 -> 枚举 转化器
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:21
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public class StringToEnumConverter<T extends BaseEnum> implements Converter<String, T> {
        private Map<String, T> enumMap = Maps.newHashMap();
    
        public StringToEnumConverter(Class<T> enumType) {
            T[] enums = enumType.getEnumConstants();
            for (T e : enums) {
                enumMap.put(e.getCode().toString(), e);
            }
        }
    
        @Override
        public T convert(String source) {
            T t = enumMap.get(source);
            if (ObjectUtil.isNull(t)) {
                throw new IllegalArgumentException("无法匹配对应的枚举类型");
            }
            return t;
        }
    }

    StringCodeToEnumConverterFactory.java

    
    /**
     * <p>
     * 编码 -> 枚举 转化器工厂类
     * </p>
     *
     * @package: com.xkcoding.springboottest.config.convert.factory
     * @description: 编码 -> 枚举 转化器工厂类
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:09
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    public class StringCodeToEnumConverterFactory implements ConverterFactory<String, BaseEnum> {
        private static final Map<Class, Converter> CONVERTERS = Maps.newHashMap();
    
        /**
         * 获取一个从 Integer 转化为 T 的转换器,T 是一个泛型,有多个实现
         *
         * @param targetType 转换后的类型
         * @return 返回一个转化器
         */
        @Override
        public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
            Converter<String, T> converter = CONVERTERS.get(targetType);
            if (converter == null) {
                converter = new StringToEnumConverter<>(targetType);
                CONVERTERS.put(targetType, converter);
            }
            return converter;
        }
    }

    3.6. 将转化器工厂添加进 Spring Boot 配置

    WebMvcConfig.java

    
    /**
     * <p>
     * MVC通用配置
     * </p>
     *
     * @package: com.xkcoding.springboottest.config
     * @description: MVC通用配置
     * @author: yangkai.shen
     * @date: Created in 2019-01-30 11:33
     * @copyright: Copyright (c) 2019
     * @version: V1.0
     * @modified: yangkai.shen
     */
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        /**
         * 枚举类的转换器工厂 addConverterFactory
         */
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverterFactory(new IntegerCodeToEnumConverterFactory());
            registry.addConverterFactory(new StringCodeToEnumConverterFactory());
        }
    }

    这样我们就可以优雅的实现枚举对象参数的自动转换了,并且支持多个类型转换。其中的类型转换失败异常,可以使用全局异常拦截来处理,不会的小伙伴可以参考以前的文章。https://xkcoding.com/2018/08/20/spring-boot-global-exception-handler.html

    5. 代码地址

    https://github.com/xkcoding/owntest/tree/master/spring-boot-test


    https://blog.csdn.net/alinyua/article/details/86383254

    https://hpgary.iteye.com/blog/2426096

    https://blog.wuwii.com/springboot-12.html

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 枚举类型作为函数参数传递; 遍历枚举,enum支持中文 namespace wo_BLL{public class common{ public enum error{错误1,错误2 }}} //此处使用 string ss = null;foreach(string s in Enum....
  • C语言使用枚举类型作为函数参数

    万次阅读 2019-08-14 17:31:17
  • Date类中声明一个枚举变量 public:enum Month{jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}; Date(int,Month,int); 主函数中声明一个Date类变量的时候 My_Code::Date b(2,jan,1992); 会报错,说jan是声明的...
  • 枚举类 #枚举类 public enum TrapVarComparison { EQ, NOEQ, CONTAIN, UNCONTAIN, REG,REGGROUP; } #Main函数 if (TrapVarComparison.EQ.equals(trapVarComparison)) { } 枚举类成员变量(有默认值) private ...
  • 转自:... It's not uncommon to create a component that has a bit of complex behavior that you want to be able to easily control, and an enumerated typ
  • 假如在一个类class one 中...在定义线程入口函数时,调用此类中的一个函数,而且函数参数包含这个error的枚举类型。 这时,在线程定义中,创建这个类的一个对象one。然后将one.ERROR_1作为函数参数传递 这样做对吗
  • C++类已注册在QML的上下文属性中,且C++类不应该在QML中实例化,但是在QML需要使用C++类提供的枚举类型作为参数传递。 解决方法: 使用qmlRegisterUncreatableType来注册一个不可实例化的C++类型,并在QML中使用 ...
  • 枚举类型

    2021-01-18 22:31:46
    枚举类型1、枚举类型的概念2、枚举的定义3、枚举类的常用方法4、类的内部定义枚举5、枚举的属性、构造方法、实例方法6、枚举的常用用法6.1、定义常量6.2、作为swicth的参数6.3、枚举中定义实例方法6.4、覆盖toString...
  • 前言: Oval校验框架被广泛集成于各类接口参数校验中, 其方便的注解语法, 易读性和扩展性. 几乎成了java后端服务代码的标配.... 在Dubbo(RPC服务)中, 并不推荐枚举类型作为参数, 原因涉及枚举类型特殊的序列...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 771
精华内容 308
关键字:

枚举类型作为参数