精华内容
下载资源
问答
  • 为了简单起见,请采用以下示例:public enum code{CODE_1("string1"),CODE_2("string2"),CODE_3("string3"),CODE_4("string4"),...}我想创建一个公共方法,以将具有已知格式(例如“ string1”,“ string2” …)的...

    假设我有一个包含100个值的枚举。为了简单起见,请采用以下示例:

    public enum code

    {

    CODE_1("string1"),

    CODE_2("string2"),

    CODE_3("string3"),

    CODE_4("string4"),

    ...

    }

    我想创建一个公共方法,以将具有已知格式(例如“ string1”,“ string2” …)的字符串转换为适当的枚举值CODE_1,CODE_2

    …通常是通过遍历所有值来完成的,如果找到匹配项,返回该枚举值。

    但是,我担心规则循环遍历所有值。这可能是一个巨大的瓶颈吗?如果不是100个元素而是1000个呢?

    作为我自己的练习,我尝试使用静态映射优化此查找,这可以确保在给定任何字符串的情况下O(1)查找时间。我喜欢这种额外的头,但仅在确实需要时才将其包括在我的代码中。您对使用迭代方法和映射方法有何想法和发现?

    public enum Code

    {

    ...

    //enum values

    ...

    //The string-to-Code map

    private static final Map CODE_MAP = populateMap();

    private static Map populateMap()

    {

    Map map = new HashMap();

    for(Code c : Code.values())

    {

    map.put(c.getCode(), c);

    }

    return map;

    }

    private String code;

    private Code(String code)

    {

    this.code = code;

    }

    public String getCode()

    {

    return this.code;

    }

    public Code convertFromString(String code)

    {

    //assume that the given string is actually a key value in the map

    return (Code) CODE_MAP.get(code);

    }

    }

    展开全文
  • java 枚举类型与int转换

    千次阅读 2015-11-07 11:16:57
    C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下: enum FruitEnum {  APPLE(1), ORANG

     C++中定义枚举的时候可以直接指定枚举项的值,如:"enum {MAX_LENGTH = 255};"。其实Java也可以,今天学到了这种语法。C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:
    enum FruitEnum {
        APPLE(1), ORANGE(2);    //    调用构造函数来构造枚举项

        private int value = 0;

        private FruitEnum(int value) {    //    必须是private的,否则编译错误
            this.value = value;
        }

        public static FruitEnum valueOf(int value) {    //    手写的从int到enum的转换函数
            switch (value) {
            case 1:
                return APPLE;
            case 2:
                return ORANGE;
            default:
                return null;
            }
        }

        public int value() {
            return this.value;
        }
    }

    public static void main(String[] args) {
        System.out.println(FruitEnum.APPLE.value());    //    1
        System.out.println(FruitEnum.ORANGE.value());    //   2
        System.out.println(FruitEnum.valueOf(1));        //  FruitEnum.APPLE
        System.out.println(FruitEnum.valueOf(2));        //  FruitEnum.ORANGE
    }
    /
    如果枚举项的值从0开始递增满足需要的话,那就简单了:
    enum MyEnum{
        FIRST_ELEMENT,
        SECOND_ELEMENT,
    }

    public static void main(String[] args) {
        System.out.println(MyEnum.FIRST_ELEMENT.ordinal());     //    0
        System.out.println(MyEnum.SECOND_ELEMENT.ordinal());    //    1
        System.out.println(MyEnum.values()[0]);        //  MyEnum.FIRST_ELEMENT
        System.out.println(MyEnum.values()[1]);        //  MyEnum.SECOND_ELEMENT
    }

    ==========================================================================

    对于:

    enum Color { RED,BLUE,BLACK YELLOW,GREEN};


           (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。  
                     Color.RED.ordinal();  //返回结果:0
                     Color.BLUE.ordinal();  //返回结果:1
           (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                     Color.RED.compareTo(Color.BLUE);  //返回结果 -1
           (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。
                     Color[] colors=Color.values();
                     for(Color c:colors){
                            System.out.print(c+","); 
                     }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,
           (4)  toString()方法: 返回枚举常量的名称。
                     Color c=Color.RED;
                     System.out.println(c);//返回结果: RED
           (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                     Color.valueOf("BLUE");   //返回结果: Color.BLUE

           (6)  equals()方法: 比较两个枚举类对象的引用。

    总结:

    1.  enum<->int

    enum -> int: int i enumType.value.ordinal();

    int -> enum: enumType b= enumType.values()[i];

    2.  enum<->String

    enum -> String: enumType.name()

    String -> enum: enumType.valueOf(name);

    展开全文
  • C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:==============================代码的分割线====...

    C++中定义枚举的时候可以直接指定枚举项的值,如:"enum {MAX_LENGTH = 255};"。其实Java也可以,今天学到了这种语法。C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:

    ==============================代码的分割线=======================================

    enum FruitEnum {

    APPLE(1), ORANGE(2);    //    调用构造函数来构造枚举项

    private int value = 0;

    private FruitEnum(int value) {    //    必须是private的,否则编译错误

    this.value = value;

    }

    public static FruitEnum valueOf(int value) {    //    手写的从int到enum的转换函数

    switch (value) {

    case 1:

    return APPLE;

    case 2:

    return ORANGE;

    default:

    return null;

    }

    }

    public int value() {

    return this.value;

    }

    }

    public static void main(String[] args) {

    System.out.println(FruitEnum.APPLE.value());    //    1

    System.out.println(FruitEnum.ORANGE.value());    //   2

    System.out.println(FruitEnum.valueOf(1));        //  FruitEnum.APPLE

    System.out.println(FruitEnum.valueOf(2));        //  FruitEnum.ORANGE

    }

    /

    如果枚举项的值从0开始递增满足需要的话,那就简单了:

    enum MyEnum{

    FIRST_ELEMENT,

    SECOND_ELEMENT,

    }

    public static void main(String[] args) {

    System.out.println(MyEnum.FIRST_ELEMENT.ordinal());     //    0

    System.out.println(MyEnum.SECOND_ELEMENT.ordinal());    //    1

    System.out.println(MyEnum.values()[0]);        //  MyEnum.FIRST_ELEMENT

    System.out.println(MyEnum.values()[1]);        //  MyEnum.SECOND_ELEMENT

    }

    展开全文
  • Jackson2.x自定义枚举值转换

    千次阅读 2018-12-03 10:44:36
    Jackson2.x自定义枚举值转换Java原生Enum太难用,对Enum进行扩展,添加了value属性,name属性;在用Jackson进行反序列化的时候遇到转换问题,简单的做法就是创建扩展枚举类转换器,在需要进行转换的属性上添加@...

    Java原生Enum太难用,对Enum进行扩展,添加了value属性,name属性;在用Jackson进行反序列化的时候遇到转换问题,简单的做法就是创建扩展枚举类转换器,在需要进行转换的属性上添加@JsonDeserialize注解。 这种做法有两个痛点:
    ​ 1.针对每个扩展的枚举类,都需要制定一个转换器。
    ​ 2.每个需要转换的枚举属性上都需要添加注解;
    是否可以创建一个通用的扩展枚举类转换器,处理所有的枚举类呢。这里遇到本文难点,如何获取属性的类对象。很自然的想从DeserializationContext中获取,如下:

    public abstract class DeserializationContext extends DatabindContext implements Serializable {
        ... 
        protected LinkedNode<JavaType> _currentType;
        ...
        public JavaType getContextualType() {
            return this._currentType == null ? null : (JavaType)this._currentType.value();
        }
    

    ​ 一开始尝试ctx.getContextualType().getRawClass()获取,但调用该方法一定会NullPointException;跟踪jackson源码后发现,发现ctx构造函数里里压根就不会初始化_currentType字段;不初始化放这里干嘛,一定别的用途,在DeserializationContext 发现有如下两个函数会给_currentType赋值。

    public JsonDeserializer<?> handlePrimaryContextualization(JsonDeserializer<?> deser, BeanProperty prop, JavaType type) throws JsonMappingException {
        if (deser instanceof ContextualDeserializer) {
            this._currentType = new LinkedNode(type, this._currentType);
            try {
                deser = ((ContextualDeserializer)deser).createContextual(this, prop);
            } finally {
                this._currentType = this._currentType.next();
            }
        }
        return deser;
    }
    
    public JsonDeserializer<?> handleSecondaryContextualization(JsonDeserializer<?> deser, BeanProperty prop, JavaType type) throws JsonMappingException {
        if (deser instanceof ContextualDeserializer) {
            this._currentType = new LinkedNode(type, this._currentType);
            try {
                deser = ((ContextualDeserializer)deser).createContextual(this, prop);
            } finally {
                this._currentType = this._currentType.next();
            }
        }
        return deser;
    }
    

    检查ContextualDeserializer,这里是一个接口,那只需要我的CommonDeserializer 实现这个接口就好了啊,

    public interface ContextualDeserializer {
        JsonDeserializer<?> createContextual(DeserializationContext var1, BeanProperty var2) throws JsonMappingException;
    }
    

    最终得到的CommonDeserializer

    @Data
    public class CommonDeserializer extends JsonDeserializer<Enum> implements ContextualDeserializer {
        private Class clz;
        @Override
        public Enum deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
            if(StringUtils.isEmpty(jsonParser.getText())){
                return null;
            }
            if(BaseEnumUtil.isImplementsBaseEnum(clz)){
                return  BaseEnumUtil.convertToEnum(clz,jsonParser.getIntValue());
            }else {
                return null;
            }
        }
    
        /**
         * 获取合适的解析器,把当前解析的属性Class对象存起来,以便反序列化的转换类型,为了避免线程安全问题,每次都new一个(通过threadLocal来存储更合理)
         * @param ctx
         * @param property
         * @return
         * @throws JsonMappingException
         */
        public JsonDeserializer createContextual(DeserializationContext ctx, BeanProperty property) throws JsonMappingException {
            Class rawCls = ctx.getContextualType().getRawClass();
            CommonDeserializer clone = new CommonDeserializer();
            clone.setClz(rawCls);
            return clone;
        }
    }
    

    扩展Jackson ObjectMapper,将通用枚举转换器注入进去,解决第二个痛点;

    @Slf4j
    public class OrderEnumConvertTest {
        private ObjectMapper objectMapper;
        @Before
        public void init(){
            objectMapper = new ObjectMapper();
            SimpleModule simpleModule= new SimpleModule();
            simpleModule.addDeserializer(Enum.class,new CommonDeserializer());
            objectMapper.registerModule(simpleModule);
        }
    
        @Test
        public  void object2Json()throws Exception{
            OrderDto orderDto = new OrderDto();
            orderDto.setOrderType(OrderEnum.JD);
            String json = objectMapper.writeValueAsString(orderDto);
            log.info(json);
            String jsonExp ="{\"orderType\":20}";
            Assert.assertEquals(jsonExp,json);
        }
    
        @Test
        public  void jsonToObject()throws Exception{
           String json = "{\"orderType\":20}";
            OrderDto orderDto =(OrderDto)objectMapper.readValue(json,OrderDto.class);
            Assert.assertEquals(OrderEnum.JD,orderDto.getOrderType());
        }
    }	
    

    源码链接todo

    展开全文
  • C++中定义枚举的时候可以直接指定枚举项的,如...但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下: ==============================代码的分割
  • c# 枚举转java枚举案例

    2017-11-21 17:18:57
    前言:我们项目需要从c#语言转换为java语言,下面我们需要讨论的是怎么把C#枚举转换java枚举。 将C#语言转成java语言?你可能会说,嘿,这不是轻而易举的是么? 事实证明这不是。 c#中的枚举可以自我进行位运算...
  • C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:[java] view plain copyenum FruitEnum { ...
  • java枚举

    2014-01-14 12:07:55
    1.创建一个最简单枚举类型 创建枚举类型要使用enum关键字,...枚举类型的每一个都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个的名称都被转换成一个字符串,并且序数设置
  • C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下: ==============================代码的分割线...
  • java 枚举 Enum

    2011-02-15 17:10:00
    创建一个最简单枚举类型 创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类,它是抽象类。其中,枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的...
  • 枚举简单总结

    2019-04-20 14:11:14
    枚举的本质就是一个类(在编译时期转换成对应final类的形式,继承自java.lang.enum) 底层实现线程安全 反编译展示的枚举类型都是static类型的属性,在类被加载后被初始化,当一个Java类第一次被真正使用到的时候静态...
  • Java中自定义枚举(Enum)项的及…

    千次阅读 2015-10-10 09:22:28
    C++的int和枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下: ==============================代码的分割线...
  • mybatis自带对枚举的处理类...但是给转换仅仅是将对应的枚举转换为其索引位置,也就是"ordinal()"方法获取到的。对应自定义的int,该类无能为力。org.apache.ibatis.type.EnumTypeHandler :该类实现了枚举类型...
  • java实现.net中的枚举

    2016-09-26 22:55:00
    Java 和 .net中的枚举不一样,在.net中,枚举是属于类型的,而在...可以很简单地给枚举赋值,也可以强制进行类型转换,非常方便,而在java中因为是引用类型,所以这样的操作是不行的,以下就是java中实现一些.net...
  • 枚举转换简单 FileType fileType=EnumUtil.Instance.NumToEnum(6); if(fileType==FileType.Unknow) Console.WriteLine("当前成员未知"); 或者 FileType fileType=EnumUtil.Instance.StringToEnum("pdf"); ...
  • Java代码中,使用枚举类型(enum)来声明这些数据域,这就涉及到了一个转换的过程: 插入数据时把枚举类型转换数字,而读取数据时把数字转换枚举类型 最简单的方法当然是手动写每一个域的转换,但是这么一来,...
  • 第六章 枚举和注解 34.用枚举类型代替 int 常量 ...没有一种简单的方法可以将 int 枚举常量转换为可打印的字符串; 如果与 int 枚举关联的发生了更改,则必须重新编译客户端。如果不重新编译,客户...
  • Java的三个简单特性

    2017-06-19 09:19:44
    今天我们我们来说说Java的三个简单的特性,泛型,枚举和注解。  一 泛型  我们举集合的例子来讲,如果没有声明集合的泛型,那么就会采用默认的Object对象作为其泛型,即任何Object子类的对象都可以进入集合,...
  • Java开发技术大全(500个源代码).

    热门讨论 2012-12-02 19:55:48
    FileList.java 自己实现的一个文件名称枚举类 MyDataIO.java 数据输入输出示例 MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java 管道流示例 MySequenceIn.java 顺序输入流示例 ObjectFileTest....
  • JAVA_Thinking in Java

    2011-12-02 17:58:15
    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 13.19.13 ...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:能不能只分配内存空间,不赋初始呢?89 4.5.4 使用数组 90 学生提问:为什么要我记住这些异常信息? 91 4.5.5 JDK1.5提供了foreach循环 91 4.6 深入数组 93 4.6.1 内存中的数组 93 学生提问:为...
  • Java2核心技术第7版全两卷.pdf中文高清

    千次下载 热门讨论 2012-09-14 14:22:28
    3.1一个简单java应用程序 3.2 注释 3.3 数据类型 .3.4 变量 3.5 运算符 3.6 字符串 3.7 输入输出 3.8 控制流程 3.9 大数值 3.10 数组 第4章 对象与类 4.1 面向对象程序设计概述 4.2 使用...
  • JAVA面向对象详细资料

    2019-03-19 00:14:10
    Java面向对象 1 1 学习方法与要求 1 2 面向对象语言与面向过程语言的区别 7 3 面向对象?什么对象? 8 4 什么是类? 9 5 如何创建一个类Class? 10 6 如何使用类创建对象 10 7 引用与实例 11 8 实例属性与实例方法 ...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    第1章 Java语言概述 1 实例001 输出“Hello World” 2 实例002 输出控制台传递的参数 2 实例003 输出由“*”组成的三角形 3 实例004 输出符号表情 5 第2章 Eclipse开发工具 6 实例005 下载并运行Eclipse工具 7 实例...
  • java相等还是不等

    2017-05-23 02:00:42
    *简单说,基本类型是相等,引用类型是引用相等 1.基本类型: *数值类型:转换后比较 *浮点数,最好不直接用== *Double.NAN==Double.NAN结果为false *boolean型无法与int相比较 第二个是因为在装箱用到了...
  • java 编程入门思考

    2012-03-30 17:50:08
    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 13.19.13 ...
  • JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
关键字:

java枚举简单值转换

java 订阅