java数据类型 枚举_Java 数据类型在实际开发中应用二枚举

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。在JDK1.5之前,人们用接口来描述这一种数据类型。

1.5以后引入枚举

一:枚举类基本语法

定义:

创建枚举类型要使用 enum 关键字,如果是想声明简单枚举,属性之间用逗号相隔 ;如果是属性带id,类似(male(1))这种还需要一个带id的构造方法

简单枚举类:

public enumColorEnum {

red, green, yellow, blue;

}

枚举像普通的类一样可以添加属性和方法,如下

public enumGender {

MALE(0), //男

FEMALE(1); //女

intid;

Gender(intid) {this.id =id;

}public intgetId() {returnid;

}

}

如果不加构造器,直接在 “类型后边加(1)”  这种形式会报错,如下:

enumColorEnum {

red(1), green(2), yellow(3), blue(4);//编译出错:The constructor ColorEnum(int) is undefined

}

因为枚举类的本质是一个Enum类,所以它可以加一些自定义的方法:比如·上边的getId()

使用:

可以用来foreach,switch传入枚举变量, case 是枚举内定义的每一个类型。

Gender gender =Gender.womenswitch(gender) {casemale:

System.out.println("male");break;casefemale:

System.out.println("female");break;

intcompareTo(E o)

比较此枚举与指定对象的顺序。

ClassgetDeclaringClass()

返回与此枚举常量的枚举类型相对应的 Class 对象。

Stringname()

返回此枚举常量的名称,在其枚举声明中对其进行声明。

intordinal()

返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

StringtoString()

返回枚举常量的名称,它包含在声明中。

static > TvalueOf(Class enumType, String name)

返回带指定名称的指定枚举类型的枚举常量。

二:web项目中应用枚举

@Enumeratedprivate Gender gender;//entity类

我们看一下Gender的配置

ublic enumGender {

MALE(0), //男

FEMALE(1); //女

intid;

Gender(intid) {this.id =id;

}public intgetId() {returnid;

}

}

,如果调用的原声的dao,查询出来的结果是Map

userVO.setGender(Gender.valueOf((String) map.get("gender")));//如果查询出来的是Map,则通过 Gender.valueOf(方法得到想要的枚举

如果是hibernate,则会不需要我们去关系到底查询出来的是什么,只需要指导是枚举类型即可

List userVOList = new ArrayList();try{

String queryString= "select * from User U left join U.institutions INS where INS.institution.id = '"

+ id + "' order by U.code";

userList=userDao.query(queryString);//如果是调用hibernate,查询出来不需要调用valueOf()方法if (userList != null && userList.size() > 0) {

}

}

三 :原理分析

enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译实际上是生成了一个类,该类继承了java.lang.Enum。所以, enum本质上 java 编译器帮我们做了语法的解析和编译的一个普通的类。

唯一的区别,是枚举隐式继承了Enum,所以不可以在继承..

EnumTest test=EnumTest.TUE;

...

System.out.println("getDeclaringClass(): " +test.getDeclaringClass().getName());//输出结果是getDeclaringClass(): com.dtsz.enumTest.EnumTest

四:EnumSet,EnumMap 的应用

EnumSet和EnumMap是枚举的比较重要的用处。他们是操作枚举对象的工具类。具体的细节推荐去看一下Java 枚举用法详解,在这里,我简单的总结一下:

EnumSet 是枚举类型的高性能Set实现。它要求放入它的枚举常量必须属于同一枚举类型。

EnumMap 是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

/EnumSet的使用

System.out.println("EnumSet展示");

EnumSet errSet = EnumSet.allOf(ErrorCodeEn.class);for(ErrorCodeEn e : errSet) {

System.out.println(e.name()+ " : " +e.ordinal());

}//EnumMap的使用

System.out.println("EnumMap展示");

EnumMap errMap = new EnumMap(StateMachine.Signal.class);

errMap.put(StateMachine.Signal.RED,"红灯");

errMap.put(StateMachine.Signal.YELLOW,"黄灯");

errMap.put(StateMachine.Signal.GREEN,"绿灯");for (Iterator> iter =errMap.entrySet().iterator(); iter.hasNext();) {

Map.Entry entry =iter.next();

System.out.println(entry.getKey().name()+ " : " +entry.getValue());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值