本文主要介绍Java中enum的使用。在开始之前,它解释了enum的用法,然后给出了一个如何操作数据库的例子。有需要的可以参考一下。
关于枚举
大多数地方写的枚举都是给出一个枚举然后例子开始切换,但是我想说我的代码出来的数据不太可能是枚举,一般是字符串或者数字。例如,在解析一个SQL之后,我首先确定SQL的类型。通过拦截SQL的令牌,被拦截的数据可以被选择、删除、更新、插入、更改等。但都是字符串。这个时候,我不想使用枚举。如何将字符串转换成枚举?类似的情况,我从数据库中取出数据根据一些类型做判断,从页面中导入数据,根据不同的类型做不同的操作。但都是字符串,不是枚举。可悲的是,我很少看到有人写这个东西;所以我写了下来,希望有人能用上。
为什么首先要使用枚举?我们什么时候使用枚举比较好,使用枚举有什么好处?
我觉得,当你在一些category类,并且可以枚举,不可改变的类型来引导程序路由到不同的地方时,枚举是一个比较好的选择;
听起来有点绕,但有个例子或许可以理解,比如:
我们可以列出以下我们在工作日做的事情:
上班,开会,吃饭,睡觉等。
我们可以列出医院耳鼻喉科需要检查的部位:
眼睛、鼻子、耳朵、嘴巴等
这些都可以列出来,我们要用不同的方式去做每一件事;
当然,你可以说:
1.它可以通过动态方法,通过配置文件或注释进行调度;
2.你可以用常量来达到类似的效果;
3.直接通过字符串的等号表示,用if else表示。
如果是通过配置加方法调度来做,灵活易修改;但如果很多参数不经常修改,我们往往会通过这种方式增加配置的负担,当你需要看系统逻辑的时候,就需要再看一遍配置和代码;但是,如果参数是动态可变的信息,使用配置是正确的选择;
常量的使用通常是数字的大小写转换,而字符串在java中不能是大小写转换。使用常数的目的比情况1和情况2的可读性更强…但是字符串数据也麻烦,除非重新映射,那是没必要的。其实枚举差不多给你映射了一次,只是封装了代码而已。既然是固定的,有语法支持,为什么不用呢!其次,常量虽然增加了可读性,但是没有类别和管理类型的概念,也就是一个枚举的定义会定义一个类别,这个类别可以很好的列出这个范围内需要的东西。常量通常是一些自定义的池,分散在一些公共类中,或者随机定义。而且枚举是在switch的时候明确定义的,属于锁枚举的范围。case不仅可以控制系统,增加可读性,还可以随时检查这一点。但是回到那句话,如果参数是变量,那么就不适合枚举。列举必须列举,或者可以列举现行制度的考虑范围。比如上面医院五官科可能还有很多东西没有列出来,但是目前医院只处理很少一部分,其他的不处理,这是为什么;什么是变量?例如,URL参数被分配给相应的方法。不可能每个人仅仅通过增加一个逻辑就可以增加一个枚举和一个案例。这时候用【配置动态方法分配】比较好。当然,配置可以通过文件或注释来完成。
而且,它是通过字符串equals和if else实现的。呵呵,这个没毛病,不过这个写的比较散。其次,字符串匹配equals需要在每次匹配时比较每个字符。如果你的代码中有很多循环,性能就不是很好。其余的看上面的描述更清楚;
其次,枚举提供了一个类型管理的组件,使面向对象的系统更加完善,使一些类型的管理可配置、可管理。在使用枚举的地方,可以沿着枚举的定义找到已经处理过的和没有处理过的,但是上面提到的那几种很难做到;例如,如果定义了10种数据库操作,那么在重新确定的过程中,枚举可以像配置文件一样处理,管理起来非常简单。
最后,枚举是绝对单例的,比较的性能与数字相当,可以获得可读性和性能的兼顾。
枚举类型的基本用法
有了这样的理论基础,我们再来看看Java中的enum枚举类型:
1、可以在enum中添加变量和方法
让我们先来看一个代码示例:
公共枚举状态{
正常('正常状态',1),已更新('已更新',2),已删除('已删除',3),已激发('已阻止',4);
//成员变量
私有字符串名称;
private int索引;
//构造函数,注意:构造函数不能是公共的,因为枚举不能实例化。
私有状态(字符串名称,int索引){
this.name=name
this.index=index
}
//通用方法
公共静态字符串getName(int index) {
for(状态c:状态。values()) {
if (c.getIndex()==index) {
返回c . name;
}
}
返回null
}
//获取设置方法
公共字符串getName() {
返回名称;
}
public void setName(字符串名){
this.name=name
}
public int getIndex() {
回报指数;
}
public void setIndex(int index) {
this.index=index
}
}
从上面的代码中我们可以看到,在定义了枚举值之后,然后在它后面加上一个分号,就可以定义其他的变量和方法了。另外需要注意的是,enum中的构造方法不能用public标记,这是为了防止用户实例化enum。
2、可以用来定义常量
让我们回顾一下Java中常量是如何定义的。请看下面的代码:
public static final int normalState=1;
private static final int updateState=2;
我们也可以用下面的enum枚举替换上面的常量定义,代码如下:
公共枚举状态{
正常、更新、删除、解雇
}
在Java中使用enum定义常量在语法上没有优势,但是enum枚举类型可以提供更多的运算函数。
3、在enum中实现接口
让我们先看看下面的代码:
公共接口ICanReadState {
void read();
string getState();
}
公共枚举状态实现ICanReadState {
正常('正常状态',1),已更新('已更新',2),已删除('已删除',3),已激发('已阻止',4);
私有字符串名称;
private int索引;
私有状态(字符串名称,int索引){
this.name=name
this.index=index
}
//接口方法1
@覆盖
公共字符串getState() {
返回this.name
}
//接口方法2
@覆盖
public void read() {
system . out . println(this . index ':' this . name);
}
}
就像通用类中使用的接口一样,enum枚举可以继承接口,并实现接口中的所有方法。这样做的好处是更方便对枚举中的值进行排序和比较,封装性更好。
例子
我们先定义一个简单的枚举(这里只是一个例子,所以简单定义三个变量):
公共枚举SqlTypeEnum {
插入,
更新,
删除,
挑选
}
此时,在解析SQL之后,我们得到了一个令牌。我们如何获得这个令牌的枚举?
听听这个:
字符串标记=' select
sqltype enum sqltype enum=sqltype enum . value of(token . toupper case());
否则java会抛出异常:IllegalArgumentException no enum const class sqltype enum . XXX。
我之所以做大写处理,是因为枚举也是大写的(当然如果你的枚举是小写的,那你也是小写的,但是混在一起就麻烦了)。事实上,valueOf是调用枚举的基础映射:
调用时将调用此方法:
所以里面也是散列表,呵呵!
获得这些信息后,您可以执行所需的操作:
开关(sqlTypeEnum) {
案例插入:处理插入逻辑;打破;
案例删除:处理删除逻辑;打破;
.
}
好吧,有时候我们不想在交互中直接使用INSERT、UPDATE之类的字符串,因为很多时候命名规范要求;
例如,定义一些用户操作类型:
1.保存用户信息。
2.通过ID获取用户的基本信息
3.获取用户列表
4.按ID删除用户信息
等等
我们可以将枚举定义为:
公共枚举UserOptionEnum {
保存_用户,
获取用户标识,
GET_USER_LIST,
删除用户标识
}
但是系统方法和一些关键字的配置通常写成:
saveUser、getUserById、getUserById、deleteUserById
当然,各有各的规则,但是如果你不想做中间层的映射,你一方面要妥协,或者你可以把所有的枚举名都改了,这看起来比较奇怪,或者你可以把所有的方法名都改了,这就更奇怪了,或者你可以自己做映射。还行,有点麻烦,但其实不麻烦?
首先,让我们编写一个方法来将枚举的带下划线的数据转换成hump,并将其放在StringUtils中:
公共静态字符串convertDbStyleToJavaStyle(String dbStyleString,boolean firstUpper) {
dbStyleString=dbStyleString . tolowercase();
string[]tokens=dbstylestring . split(' _ ');
StringBuilder StringBuilder=new StringBuilder(128);
int length=0;
for(字符串标记:标记){
if(string utils . isnotblank(token)){
if(length==0!firstUpper) {
stringbuilder . append(token);
}否则{
char c=token . charat(0);
if(c=' a ' | | c=' z ')c=(char)(c-32);
stringbuilder . append(c);
stringbuilder . append(token . substring(1));
}
}
长度;
}
返回stringbuilder . tostring();
}
重载方法:
公共静态字符串convertDbStyleToJavaLocalStyle(String dbStyleString){
返回convertDbStyleToJavaStyle(dbStyleString,false);
}
然后定义枚举:
公共枚举UserOptionEnum {
保存_用户,
获取用户标识,
GET_USER_LIST,
删除用户标识;
private final static MapString,useroponenum ENUM _ MAP=new hashmap string,useroponenum(64);
静态{
for(UserOptionEnum v : values()) {
ENUM_MAP.put(v.toString(),v);
}
}
public staticuserpoptionenum from String(String v){
user option ENUM user option ENUM=ENUM _ map . get(v);
return userOptionEnum==null?默认值:userOptionEnum
}
公共字符串toString() {
string string value=super . tostring();
返回string util . convertdbstyletojavalocalstyle(string value);
}
}
好,传递一个事件参数,如果是:saveUser,那么使用:
String event=' saveUser//如果你在这里得到参数
user option enum enum=user option enum . from string(event);
实际上,我自己做了一个散列表。我在这里添加了一个fromString,因为枚举有一些限制,有些方法不会让你覆盖它。比如valueOf方法就是这样的。
其实没什么好谈的。先说枚举和添加一些自定义变量。其实除了是单例之外,枚举的其余部分和普通类差不多。它也可以有一个构造方法,但不是默认的。还可以提供自定义变量,然后获取set和get方法。但是,如果有set,线程就不安全。注意这个。所以一般来说,构造方法是这样写的:
公共枚举SqlTypeEnum {
插入('插入'),
删除(“删除自”)
.省略;
私有字符串名称;//定义自定义变量
私有SqlTypeEnum(字符串名称){
this.name=name
}
公共字符串getName() {
返回名称;
}
公共字符串toString() {
返回名称“神圣的狗屎”;//重写toString方法
}
//一般不推荐
公共空集合名(字符串名)>
此。名称=名称;
}
}
调用下:
sqltypeenum sqltypeenum=sqltypeenum。(“insert”)的值;
系统。出去。println(sqltypeenum);
系统。出去。println(sqltypeenum。getname());
不推荐也调用下:
:
在另一个线程:
sqltypeenum sqltypeenum=sqltypeenum。(“insert”)的值;
系统。出去。println(sqltypeenum);
系统。出去。println(sqltypeenum。getname());
发现结果被改了,呵呵!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。