Java枚举的反向查找

java的枚举常常被用来替代常量值,每个枚举值代表一个特定的常数。

在反序列化时有常常需要用到常数到枚举的转换,这就涉及到枚举的反向查找。

1、从枚举名反向查找枚举

这种方法是最先使用也最为简便的

可以用到枚举的静态方法valueOf(String name)

valueOf方法为内置方法,使用简便,但在查找不到枚举时会抛出异常。

熟悉异常的同学可能知道异常抛出时,需要收集虚拟机的调用堆栈上下文信息,对性能影响较大。

使用时,常常需要使用这么一个反序列化查找方法

E find(String name, E defaultValue),在查找不到时能够返回一个默认值而不是抛出异常

2、从枚举值所包含的描述值反向查找枚举

例如这种枚举定义

public enum SomeEnum{
    A("ADes", 1),
    B("BDes", 2),
    unknown("UNKNWONDes", 3);

    private string des;
    private int order;

    private SomeEnum(string des, int order){
        this.des = des;
        this.order = order;
    }
}

此时可以在枚举类中增加一个HashMap,并在类加载时初始化好。

public enum SomeEnum{
    A("ADes"),
    B("BDes"),
    unknown("UNKNWONDes");

    private string des;

    private static final map lookup = new hashmap();

    static {
        for(SomeEnum e : EnumSet.allOf(SomeEnum.class)){
            lookup.put(e.des, e);
        }
    }

    private SomeEnum(string des){
        this.des = des;
    }

    public static SomeEnum find(string des, SomeEnum defaultValue){
        SomeEnum value = lookup.get(des);
        if(value == null){
            return defaultValue;
        }
        return value;
    }
}

3、进一步,如果枚举中有多个描述值,并且描述值类型不一样

这时初始化代码和查找代码需要写多遍。

public enum SomeEnum{
    A("ADes", 1),
    B("BDes", 2),
    unknown("UNKNWONDes", 3);

    private string des;
    private int order;

    private static final map lookup = new hashmap();

    private static final map lookup_int = new hashmap();

    static {
        for(SomeEnum e : EnumSet.allOf(SomeEnum.class)){
            lookup.put(e.des, e);
            lookup_int.put(e.order, e);
        }
    }

    private SomeEnum(string des, int order){
        this.des = des;
        this.order = order;
    }

    public static SomeEnum find(string des, SomeEnum defaultValue){
        SomeEnum value = lookup.get(des);
        if(value == null){
            return defaultValue;
        }
        return value;
    }

    public static SomeEnum find(int order, SomeEnum defaultValue){
        SomeEnum value = lookup_int.get(order);
        if(value == null){
            return defaultValue;
        }
        return value;
    }
}

不少代码有重复,

枚举类需要自己实现反向查找映射关系在HashMap中的初始化。

根据DRY原则,重复代码地方一般都有一定的坏味道。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, private
, des
, java ocket 反向
, value
, defaultvalue
, order
, java 枚举
, java枚举
java枚举的使用
java 反向dns查找、java string 反向查找、java 反向查找、java 枚举、java枚举类型的用法,以便于您获取更多的相关知识。

时间: 2024-10-16 03:05:54

Java枚举的反向查找的相关文章

探讨置换规律中的“推”理论和“反向查找”理论

本文曾参考"懵懂斋"和"hoodlum"老师写的相关资料. 对于置换规律的解释有两种方法(这里我把它称为理论).一种叫"推",一种叫"反向查找",两者并不矛盾. 我在以前的帖中是用的"推"理论解释的.因为用"反向查找"理论来解释,更为抽象,用语言表达比较困难. 解释置换中的有些规律,有时用"反向查找"理论,反而更好理解. 什么叫"推"理论? 1.被

一起学DNS系列(五)创建DNS正向、反向查找区域

上一节中简要介绍了DNS服务器及客户端的安装,尽管涉及的知识点很少,但也已经包含了DNS系统不 可缺少的两部分,即DNS服务器和客户端,此外,DNS系统还包括区域和资源记录,本节主要讨论DNS正向和反向查找区域的创建. 第一节里提到了"区域"这个概念,简单来讲,区域就是 DNS服务器具有权威管理权限的连续的命名空间.在一个DNS服务器里,可以创建多个区域,比如 a.com 和b.com,而在每一个区域下有可以新建多个域.请注意,这里首先建立的是区域,其后才是域,而且也只能是域,因为在一

Java枚举类用法实例

  本文实例讲述了Java枚举类用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package com.school.stereotype; /** * 活动枚举类型 * @

源代码-JAVA枚举类定义中泛型的使用

问题描述 JAVA枚举类定义中泛型的使用 在枚举类的源代码中,有这样的定义:Enum > 在网上看了很多人的文章都没有看懂,请能够解释清楚的大神帮忙说说.E extends Enum到底有什么用? 为什么要这么写? 解决方案 E这个类继承了Enum,也就是E也是个枚举类型

Java枚举的七种常见用法总结(必看)_java

用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { GREEN, YELLOW,

Java枚举(enum) 详解7种常见的用法_java

JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便.  用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int

Java使用二分法进行查找和排序的示例_java

实现二分法查找二分法查找,需要数组内是一个有序的序列 二分查找比线性查找:数组的元素数越多,效率提高的越明显 二分查找的效率表示:O(log2N) N在2的M次幂范围,那查找的次数最大就是M,  log2N表示2的M次幂等于N, 省略常数,简写成O(logN) 如有一个200个元素的有序数组,那么二分查找的最大次数: 2^7=128, 2^8=256, 可以看出7次幂达不到200,8次幂包括, 所以最大查找次数就等于8 //循环,二分查找 static int binarySearch(int[

Java枚举类enum介绍_java

枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum.和其它普通类一样,enum同样可以有成员变量.方法.构造器,也可以实现一个或多个接口,区别是: 1.如果有构造器,必须用private修饰. 2.枚举类不能派生子类. 3.枚举类所有的实例必须在第一行显示定义.系统会自动给这些实例加上public static final修饰,无须程序员显示定义

Java枚举详解及使用实例(涵盖了所有典型用法)_java

在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法. package com.ljq.test; /** * 枚举用法详解 * * @author jiqinli