本文主要介绍了Java枚举类型enum的详细说明以及所使用的相关资料。有需要的朋友可以参考一下。
Java枚举类型enum的详解及使用
最近和同事讨论问题的时候,同事突然提到为什么Java中定义的常量值是用public final静态类型而不是穆恩枚举类型定义的?以前我们都是用这个定义,很少用enum定义,所以没有注意。面对破门而入的问题,真的有点搞不清楚为什么会有这样的定义。既然不懂,那就花时间研究一下。
Java中的枚举类型是由关键字enum定义的,这是jdk1.5中的新类型。所有枚举类型都是从Enum类型继承的。为了理解枚举类型,建议您在jdk中打开Enum类并简单阅读一下。这个类中定义了许多受保护的方法,比如构造函数。如果要使用这些方法,我们可以在当前类中定义枚举类型。每种枚举类型都有自己的名称和顺序。当我们输出一个枚举类型时,我们将输入该枚举类型的名称。详情请参考下面的例子。
一、 通常定义常量方法
我们通常用public final static方法来定义以下代码:1表示红灯,3表示绿灯,2表示黄灯。
包com . csdn . myenum;
公共类灯{
/*红灯*/
public final static int RED=1;
/*绿灯*/
public final static int GREEN=3;
/*黄灯*/
public final static int YELLOW=2;
}
二、 枚举类型定义常量方法
枚举类型的简单定义方法如下。我们似乎不能定义每个枚举类型的值。例如,我们定义红灯、绿灯和黄灯的代码可能如下:
公共枚举灯{
红色、绿色、黄色;
}
我们只能显示红灯、绿灯、黄灯,不能显示具体数值。不要担心,由于枚举类型提供了一个构造函数,我们可以通过构造函数和重写toString方法来实现它。首先给Light枚举类型添加一个构造方法,然后通过构造函数把每个枚举类型的值传入对应的参数,同时重写toString方法,其中返回构造函数传入的参数。修改后的代码如下:
公共枚举灯{
//使用构造函数传递参数
红色(1),绿色(3),黄色(2);
//定义私有变量
private int nCode
//构造函数,枚举类型只能是私有的
专用灯(int _nCode) {
这个。nCode=_ nCode
}
@覆盖
公共字符串toString() {
返回String.valueOf ( this。nCode);
}
}
三、 完整示例代码
枚举类型的完整演示代码如下:
包com . csdn . myenum;
导入Java . util . enum map;
导入Java . util . enum set;
公共类LightTest {
//1.定义枚举类型
公共枚举灯{
//使用构造函数传递参数
红色(1),绿色(3),黄色(2);
//定义私有变量
private int nCode
//构造函数,枚举类型只能是私有的
专用灯(int _nCode) {
这个。nCode=_ nCode
}
@覆盖
公共字符串toString() {
返回String.valueOf ( this。nCode);
}
}
/**
* @param args
*/
公共静态void main(String[] args ) {
//1.遍历枚举类型
系统。出去。println('演示枚举类型的遍历.);
testTraversalEnum();
//2.演示EnumMap对象的使用
系统。出去。println('演示EnmuMap对象的使用和遍历.');
testEnumMap();
//3.演示EnmuSet的使用
系统。出去。println('演示EnmuSet对象的使用和遍历.');
testEnumSet();
}
/**
*演示枚举类型的遍历
*/
私有静态void testTraversalEnum() {
light[]all light=light . values();
for(Light Light:all Light){
系统。出去。println('当前灯名:' light . name());
系统。出去。println('当前灯序号:' aim . ordinal());
系统。出去。println('当前灯:'亮');
}
}
/**
*演示EnumMap的使用,它类似于HashMap的使用,只是键是枚举类型。
*/
私有静态void testEnumMap() {
//1.演示EnumMap对象的定义。EnumMap对象的构造函数需要传入参数,默认为key的类类型。
enummadride,String current map=new enummadride,String(
光。类);
Currmap.put (light.red,'红灯');
Enummap.put (light.green,'绿灯');
Currmap.put (light.yellow,'黄灯');
//2.遍历对象
for(Light Light:Light . values()){
系统。出去。println('[key=' light . name()',value='
current map . get(light)']');
}
}
/**
*演示如何使用EnumSet,它是一个抽象类,用于获取类型的枚举类型内容BR/
*您可以使用allOf方法。
*/
私有静态void testEnumSet() {
enum set Light current um set=enum set . allof(Light。类);
for(灯光对齐设置元素:当前设置){
系统。出去。println('当前EnumSet中的数据为:' aLightSetElement ');
}
}
}
执行结果如下:
演示枚举类型的遍历。
当前灯名:红色
当前灯序号:0
当前灯:1
当前灯名:绿色
当前灯序号:1
当前灯:3
当前灯名:黄色
当前灯序号:2
当前灯:2
演示EnmuMap对象的使用和遍历.
[键=红色,值=红灯]
[键=绿色,值=绿灯]
[键=黄色,值=黄灯]
演示EnmuSet对象的使用和遍历.
枚举集中的当前数据是:1
当前枚举集中的数据是:3
枚举集中的当前数据是:2
四。一般定义常数和枚举定义常数的区别。
以下可能比较无聊,但绝对值得一瞥。
1.代码:
公共类状态{
public static final int ON=1;
public static final Int OFF=0;
}
怎么了?大家都用这个很久了,没有问题。
首先,它不是类型安全的。你必须确定它是int
其次,你要确定它的范围是0和1。
最后,很多时候当你打印出来的时候,你只会看到1和0,
但是那些没有看到代码的人不知道你想做什么。扔掉所有旧的公共静态final常量。
2.您可以创建一个枚举类,并将其视为普通类。只是它不能继承其他类。(java是单继承,它继承了Enum),
您可以添加其他方法,覆盖它自己的方法。
3.switch()参数可以使用enum。
4.values()方法是由编译器插入到Enum定义中的静态方法。因此,当您将枚举实例向上转换为父类枚举时,values()是不可访问的。解决方案:类中有一个getenumConstants()方法,所以即使Enum接口中没有values()方法,我们仍然可以通过类对象获取所有的Enum实例。
5.不能从enum继承子类。如果需要在接口内扩展enum中的元素,请创建一个实现接口的枚举来对元素进行分组。对枚举的元素进行分组。
6.使用EnumSet代替标志。枚举要求其所有成员都是唯一的,但不能在枚举中删除添加的元素。
7.enummap的键是enum,值是任何其他Object对象。
8.enum允许程序员为eunm实例编写方法。因此,每个枚举实例可以被赋予不同的行为。
9.使用enum的责任链。这是与设计模式相关的责任链模式。用许多不同的方法解决一个问题。然后将它们连接在一起。当请求到来时,遍历链,直到链中的解决方案可以处理该请求。
10.使用枚举的状态机
11.使用枚举多路复用
感谢您的阅读,希望能帮到您,也感谢您对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。