原标题:Java 枚举与字符串的转换

(点击上方公众号,可快速关注)

来源:xieyu_zy

链接:blog.csdn.net/xieyuooo/article/details/8483267

文章简单,相信在很多网站都能搜索到java enum枚举的使用方式;可能有些东西我当时在刚开始用的时候没找到,所以我写了这篇文章,例如:

大多数地方写的枚举都是给一个枚举然后例子就开始switch,可是我想说,我代码里头来源的数据不太可能就是枚举,通常是字符串或数字,比如一个SQL我解析后首先判定SQL类型,通过截取SQL的token,截取出来可能是SELECT、DELETE、UPDATE、INSERT、ALTER等等,但是都是字符串,此时我想用枚举就不行了,我要将字符串转换成枚举怎么转呢,类似的情况还有从数据库取出数据根据一些类型做判定,从页面传入数据,根据不同的类型做不同的操作,但是都是字符串,不是枚举,悲剧的是我很少看到有人写到这个东西;所以我把它写下来,希望有人能用到。

首先为什么要用枚举?我们在什么时候用枚举比较好,用枚举有啥优势?

我认为哈,当你在一些一个范畴类,并可列举,不变化的类型,用以指导程序向不同的地方路由,用枚举是较好的选择;

听起来有点绕,不过有个例子也许可以明白,例如:

我们可以列举下日常工作日所做的事情:

上班、开会、吃饭、睡觉等

我们可以列举医院五官科需要检查人的部位:

眼睛、鼻子、耳朵、嘴巴等

这些都是可以被列举的,且每种事情我们要用不同的方式去做;

当然你可以说:

1、可以用动态方法分派,通过配置文件或annotation;

2、可以使用常量来达到类似的效果;

3、直接通过字符串的equals来表达,用if else来表达

如果用配置加方法分派来做,是灵活,便于修改;但是如果在很多不经常修改的参数上,我们用这中方式往往增加配置的负担,并且当你需要看系统逻辑的时候,需要需要一遍看配置一遍看代码;不过,如果参数是可动态变换的信息,用配置是正确的选择;

而常量的使用,通常在switch case的时候都是数字,字符串在java中是不能做switch case的,使用常量的目的比case 1、case 2 …这种增加了可读性;但是字符串数据也麻烦,除非再映射一次,那没那个必要,其实枚举也差不多是帮你映射了一次,只是它将代码封装了而已吧了,既然他弄好了,而且语法上支持,干嘛不用呢!其次,常量虽然增加了可读性,不过他没有范畴和管理类型的概念,即一个枚举的定义会定义个范畴,可以很好的将这个范围所需要的东西列举出来,而常量通常是些自己定义的一些池,放在一些公共类中或随机定义,都是比较零散的,并且枚举在switch的时候就明确定义好了就在锁列举的范围内case,既可以控制好系统,增加可读性,并且可以随时查看这个范畴的枚举信息到底有那些,达到类似看配置文件的作用;不过还是回到那句话,如果参数是可变的,那么就不适合做枚举,枚举是一定是可列举的,或者说当前系统考虑范围是可以被枚举的,例如上面的医院五官科,可能还有很多没有列举到,但是当前医院只处理几个部位,不处理其他的,就是这个道理;什么是可变的呢,例如URL参数来分派到对应方法,不可能大家加一段逻辑就去加一个枚举,加一个case,此时用【配置+动态方法分派】更好,当然配置可以用文件或annotation而已。

还有最土的就是,通过字符串equals,用if else来实现,呵呵,这个并没有什么不好,只是这个写比较零散,其次,字符串匹配的equals每次匹配都需要对比每个字符,如果你的代码中大量循环,性能并不是很好,其余的看看上面的描述就更加清楚了;

其次,枚举提供一种类型管理的组件,让面向对象的体系更加完善,使得一些类型的管理既可配置化,并可以管理,在使用枚举的地方都可以沿着枚举的定义找到那些有处理过,那些没处理过,而上述几种很难做到;例如,数据库的操作类型定义了10种,那么再判定的过程中就可以讲枚举像配置文件一样看待,而又非常简单的来管理。

最后,枚举绝对是单例的,对比的性能和数字性能相当,既可以得到可读性,也可以得到性能。

我们先定义个简单枚举(这里只是个例子,就简单定义3个变量了):

public enum SqlTypeEnum {

INSERT ,

UPDATE ,

DELETE ,

SELECT

}

此时解析SQL后,获取出来一个token,我们要获取这个token的枚举怎么获取呢?

这样获取:

String token = "select";

SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf(token.toUpperCase());

如果没获取到,java会抛出一个异常哦:IllegalArgumentException No enum const class SqlTypeEnum.XXX

我做大写处理的原因是因为枚举也是大写的(当然如果你的枚举是小写的,那你就小写,不过混写比较麻烦哈),其实valueOf就是调用了枚举的底层映射:

调用的时候会调用这个方法:

所以内部也是一个HashMap,呵呵!

拿到这个信息后,就可以做想要的操作了:

switch(sqlTypeEnum) {

case INSERT:处理insert逻辑;break;

case DELETE:处理delete逻辑;break;

....

}

OK,有些时候可能我们不想直接用INSERT、UPDATE这样的字符串在交互中使用,因为很多时候命名规范的要求;

例如定义一些用户操作类型:

1、保存用户信息

2、通过ID获取用户基本信息

3、获取用户列表

4、通过ID删除用户信息

等等

我们可能定义枚举会定义为:

public enum UserOptionEnum {

SAVE_USER,

GET_USER_BY_ID,

GET_USER_LIST,

DELETE_USER_BY_ID

}

但是系统的方法和一些关键字的配置,通常会写成:

saveUser、getUserById、getUserById、deleteUserById

当然各自有各自的规则,不过中间这层映射,你不想做,就一方面妥协,要么枚举名称全部换掉,貌似挺奇怪的,要么方法名称全部换掉,更加奇怪,要么自己做映射,可以,稍微麻烦点,其实也不麻烦?

我们首先写个将枚举下划线风格的数据转换为驼峰的方法,放在一个StringUtils里面:

public static String convertDbStyleToJavaStyle(String dbStyleString , boolean firstUpper) {

dbStyleString = dbStyleString.toLowerCase();

String []tokens = dbStyleString.split("_");

StringBuilder stringBuilder = new StringBuilder(128);

int length = 0;

for(String token : tokens) {

if(StringUtils.isNotBlank(token)) {

if(length == 0 && !firstUpper) {

stringBuilder.append(token);

}else {

char c = token.charAt(0);

if(c >= 'a' || c <= 'z') c = (char)(c - 32);

stringBuilder.append(c);

stringBuilder.append(token.substring(1));

}

}

++length;

}

return stringBuilder.toString();

}

重载一个方法:

public static String convertDbStyleToJavaLocalStyle(String dbStyleString) {

return convertDbStyleToJavaStyle(dbStyleString , false);

}

然后定义枚举:

public enum UserOptionEnum {

SAVE_USER,

GET_USER_BY_ID,

GET_USER_LIST,

DELETE_USER_BY_ID;

private final static Map ENUM_MAP = new HashMap(64);

static {

for(UserOptionEnum v : values()) {

ENUM_MAP.put(v.toString() , v);

}

}

public staticUserOptionEnum fromString(String v) {

UserOptionEnum userOptionEnum = ENUM_MAP.get(v);

return userOptionEnum == null ? DEFAULT :userOptionEnum;

}

public String toString() {

String stringValue = super.toString();

return StringUtil.convertDbStyleToJavaLocalStyle(stringValue);

}

}

OK,这样传递一个event参数让如果是:saveUser,此时就用:

String event = "saveUser";//假如这里得到参数

UserOptionEnum enum = UserOptionEnum.fromString(event);

其实就是自己做了一个hashMap,我这加了一个fromString,因为枚举有一些限制,有些方法不让你覆盖,比如valueOf方法就是这样。

其实没啥好讲的了,非要说,再说说枚举加一些自定义变量吧,其实枚举除了是单例的外,其余的和普通类也相似,它也可以有构造方法,只是默认情况下不是而已,也可以提供自定义的变量,然后获取set、get方法,但是如果有set的话,线程不是安全的哦,要注意这点;所以一般是构造方法就写好了:

public enum SqlTypeEnum {

INSERT("insert into"),

DELETE("delete from")

......省略;

private String name;//定义自定义的变量

private SqlTypeEnum(String name) {

this.name = name;

}

public String getName() {

return name;

}

public String toString() {

return name + " 我靠";//重写toString方法

}

//一般不推荐

public void setName(String name) {

this.name = name;

}

}

调用下:

SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf("INSERT");

System.out.println(sqlTypeEnum);

System.out.println(sqlTypeEnum.getName());

不推荐也调用下:

sqlTypeEnum.setName("我靠");

在另一个线程:

SqlTypeEnum sqlTypeEnum = SqlTypeEnum.valueOf("INSERT");

System.out.println(sqlTypeEnum);

System.out.println(sqlTypeEnum.getName());

发现结果被改了,呵呵!

觉得本文对你有帮助?请分享给更多人

关注「ImportNew」,看技术干货返回搜狐,查看更多

责任编辑:

java 枚举转换_Java 枚举与字符串的转换相关推荐

  1. java枚举类型转换_java枚举类型enum值与整数的转换

    java编程中偶尔会用到枚举,为了直观,我们通常将枚举值设置为形象的单词,方便理解和使用.枚举类型相当于数据库 中字典表,但是枚举只有字典表的值,缺少其他用来表示和值一一对应的字段,当我们在数据库中保 ...

  2. java枚举数字_Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: packagejava上课;public classEnumTest {public static voidmain(String[] args) { ...

  3. java枚举 数字_java 枚举

    Java中枚举的线程安全性及序列化问题 --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字 ...

  4. java枚举数字_Java 枚举 通过数字实例化枚举类型

    package com.zjl.domain.enumtype; /** * 枚举类 * * @Author zjl * @Date 2018/06/27 */ public enum EnumTyp ...

  5. java 枚举 大小_Java枚举入门

    枚举类(掌握) 枚举的诞生历史(了解) 在服装行业,衣服的分类根据性别可以表示为三种情况:男装.女装.中性服装. private ? type: public void setType(? type) ...

  6. java 枚举 注解_Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  7. java 枚举 接口_java枚举接口

    java中的枚举类 枚举类(enum),与class和interface关键字地位相同. 枚举类是一个特殊的类,可以有自己的成员变量.方法.构造器,可以实现一个或多个接口.一个java源文件中只能有一 ...

  8. java枚举 赋值_java 枚举 - java 枚举构造函数赋值-java 枚举 set 赋值-嗨客网

    Java枚举教程 我们已经了解了 Java枚举详解 语法 [public] enum 枚举类型名称{ 枚举对象1,枚举对象2,枚举对象3...枚举对象n; } 参数 参数 描述 [public] 可选 ...

  9. java输入枚举型_Java 枚举型为什么是静态的,以及是怎么实现的?

    确实,枚举类型总让我们觉着怪怪的,无论是语法还是静态非静态,还是操作方法,总让人觉着它和数组.列表等格格不入.那到底是为什么呢? 我们从本质分析下java的枚举类型. 1 枚举类型初探 枚举类型,其语 ...

最新文章

  1. springboot优雅停机
  2. The document “Main.storyboard” requires Xcode 8.0 or later
  3. String内存分配
  4. php去掉查询返回的字段序列,php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回...
  5. Java 11将包含更多功能
  6. 计算机模拟人工录入,用计算机模拟交互式输入代替人工进行流程录入
  7. ?Sized 和 Sized
  8. WIFI 802.11协议传输速率
  9. centos7安装其他源以及安装软件
  10. 最新java学习资料汇总(学习路线+视频教程+网盘下载)
  11. 联想Thinkpad T580 20L9 20LA Wistron LTS-2 17812-1笔记本点位图
  12. 一篇文章带你彻底了解Kubernetes
  13. Drozer的基本使用
  14. 解决NUC8豆子峡谷装黑苹果键盘错位的设置
  15. Python注释之TODO注释
  16. 联想笔记本重装windows10系统
  17. html怎么动态背景,HTML 动态背景
  18. PS~了解PS的第一步,基本操作
  19. 敏捷已死:一场程序员们历经20年的失败反叛
  20. NVM Node版本管理工具

热门文章

  1. CAD制图软件使用心得(第五期)
  2. base64和普通字符串互转---window.btoa window.atob;图片的base64格式
  3. MES,企业的阿瑞斯之剑
  4. Go 2.0 该如何满足开发者的期待?
  5. 点阵图像与矢量图像的计算机记录原理,第二章像素地概念,分辨率地概念,点阵及矢量图象地特点。第四节:图像格式地选择.docx...
  6. 计算机毕业设计之 [含论文+源码等]基于java+ssh+mysql实现的美食网站
  7. 拼多多放心推系统必须知道的规则!千万别错过
  8. Excel如何选表格中所有加粗体字的单元格
  9. ThunderBoard与EFR32MG初印象-Silabs厦门workshop笔记
  10. 整合ssm——实现登录功能(前后端完全分离)