Java的Enum类型介绍 (格式待整理)

本文详细介绍了Java中枚举类型(Enum)的定义方法及其与常量类型的区别,展示了如何使用枚举类型进行复杂操作,包括定义逻辑、使用EnumSet与EnumMap等。此外,文章还列举了一些使用枚举类型时需要注意的事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java的Enum类型介绍


JDK从1.5版本开始支持Enum类型。Enum类型可以将一组类似的值包含在一种类型中。如{MON, TUE, WEN,THU, FRI}。这一点类似于常量类型。但Enum类型提供了相比与常量类型提供了更多的可操作性。

一.与常量类型定义的区别 

常用的常量定义方法是使用static final修饰符,这种方法存在一些问题,使用Enum类定义常量可以避免这些问题的产生。

1.static final 类型常量定义

使用static final方法定义常量是常用的方法。在使用这种方法定义常量时定义方便,但存在一些问题。
类型不安全。两个不相关的常量可以进行比较和运算。
必须通过类访问。由于常量是类的成员变量,其他类需要访问时必须通过类来访问。
修改时麻烦。由于static final型的常量属于编译时常量。即每次编译过程结束后,在.class文件中写入的是常量的值,如下面的示例中,所有引用RED的地方被替换为0.在.class文件中不会有RED出现。这样的不方便之处在于每次修改常量的值时,所有引用该常量的文件都需要重新编译。
代码示例:
public class TrifficLight
{
public static final int RED = 0;
public static final int GREEN = 1;
public static final int YELLOW = 2;
}
类型无指义性。由于属于编译时常量,在运行期调试时,日志中出现的只是数字,难以理解。

2.Enum型定义常量

Java中的Enum类型的声明方式如下:
public enum TrifficLight {RED, GREEN, YELLOW};
这一组枚举类型中的值与其他定义的枚举类型中的值是不可以比较和计算的,否则将产生编译错误。这提供了类型安全性。并且因为Enum类型不是编译时常量,在修改Enum时,只需要编译修改的文件,不需要再编译引用它的文件。
与C/C++中的Enum类型不同的是Java中允许在Enum类型的定义中添加任意的方法和域,并实现任意的接口。除了Enum无法继承其他的类以外(Java中是单继承,Enum已经继承了java.lang.enum类)和一个普通的类的功能一样。
下面是在Enum中添加方法和域的示例:
public enum TrifficLight
{
RED(1),GREEN(2),YELLOW(3);
private int index;
private TrifficLight (int index)
{
this.index = index;
}
public int getIndex()
{
return index;
}
}
通过这种添加域与方法的方式,引用该Enum类型时,可以通过getIndex()方法访问在定义时赋予的值。即在其他类中,可以通过TrifficLight.RED.getIndex()得到RED初始化的值1.对于初始化的值得类型,可以是任何基本类型,也可以是自定义的类。Enum类型具有一些自带的方法,如name()——获取Enum类型定义的名称,如RED;ordinal()——获取Enum类型的序号;toString()——可覆盖,默认范围Enum类型定义的名称。这样Enum类型即可实现灵活的常量定义的功能,并使常量具有一定的指义性。

二.Enum复杂操作

Enum类型除了进行普通的常量定义外还具有其他的功能。如使用switch语句、定义复杂逻辑、使用EnumSet、EnumMap管理等功能。

使用switch语句

Switch语句支持Enum类型,示例如下:
TrifficLight light = TrifficLight.RED;
switch(light)
{
case RED : ...;break;
case GREEN : ...;break;
case YELLOW : ...;break;
default : ...;break;
}

2.遍历Enum类型

Enum自带的values()方法可以用来遍历Enum中的数据。示例如下:
for (TrifficLight light : TrifficLight.values())
{
System.out.println(light.name());
}
输出结果为:
RED
GREEN
YELLOW

使用自带工具类

Enum类具有两个工具类,EnumSet和EnumMap。
EnumSet类。EnumSet类是针对Enum类的Set接口的实现。同一个EnumSet中装入的必须是同一类型的Enum.EnumSet具有若干遍历或取子集的方法,现举其中一个示例如下:
for(TrifficLigth light : EnumSet.range(TrifficLight.RED, TrifficLight.GREEN))
{
System.out.println(light.name());
}
输出为:
RED
GREEN
其中range()方法用于在一个范围内对Enum进行迭代,另外of()方法可以用于取Enum的子集,allOf()方法可以去Enum的全集。
(2)EnumMap类。EnumMap类是针对Enum类的Map接口的实现。EnumMap中的key是Enum类型。示例如下:
private Map<TrifficLight, String> mapTest = new EnumMap<TrifficLight, String>
(TrifficLight.class);
mapTest.put(TrifficLight.RED, new String(“red”));
System.out.println(mapTest.get(TrifficLight.RED));

使用接口组织Enum

Enum类不可以继承其他类,但可以实现接口,通过接口可以实现Enum类的扩展。示例如下:
public interface Fruit{}
public enum Apple implements Fruit{FUJI,PIPPIN};
public enum Orange implements Fruit{NAVEL, TEMPLE};
则所有的Enum类型都是一种Fruit。定义方法如下:
private static <T extends Enum<T> & Fruit> void taste(Class<T> fruitSet)
{
for(Fruit fruit : fruitSet.getEnumConstants())
{
System.out.println(fruit);
}
}
调用taste(Apple.class);输出:
FUJI
PIPPIN
调用taste(Orange.class);输出:
NAVEL
TEMPLE

对每个Enum对象自定义方法

由于每个Enum的对象均为一个类,则在其中可以自定义方法。示例如下:
enum Apple
{
FUJI {public void taste(){System.out.println("it's sweet");}},
PIPPIN {public void taste(){System.out.println("it's sweet,too");}};
abstract void taste();
}
调用:
for(Apple apple : Apple.values())
{
apple.taste();
}
输出:
it's sweet
it's sweet,too
利用这种自定义特性,可以使用Enum类型实现责任链模式,也可以用来实现状态机。

三.使用Enum注意事项

使用Enum时需要注意几点:
构造函数。构造函数为private型,不能使public或protected。所有枚举对象不能在外部声明,Enum只在引用它的第一次对所有的对象进行初始化一次。
符号。定义Enum类型时,如果是简单类型,则最后一个枚举值后不用跟任何一个符号,如果有定制方法,则必须跟一个分号“;”。
判断相等。由于Enum的类型时通过运行期构造出对象来表示的,所以在集群环境下,不同虚拟机中构造出的枚举对象通过“==”来判断相等返回为false,由于二者不是同一个对象实例。在比较时需要注意。

转载于:https://www.cnblogs.com/moonc/p/3382544.html

### 回答1: Javaenum类型是一种特殊的类型,它可以用来定义一组有限的常量。enum类型Java语言中的一个关键字,可以用来定义枚举类型。每个enum常量都是enum类型的一个实例。enum类型可以用来定义枚举类型,例如月份、星期、颜色等。 例如: ``` enum Season { SPRING, SUMMER, FALL, WINTER } ``` 上面代码定义了一个枚举类型Season,它有4个枚举常量:SPRING、SUMMER、FALL和WINTER。 enum类型也可以带有构造函数和方法,带有构造函数和方法的enum类型需要利用关键字enum定义 ``` enum Color { RED("红色", 1), GREEN("绿色", 2), BLUE("蓝色", 3); private String name; private int index; private Color(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } } ``` 上面代码定义了一个枚举类型Color,它有3个枚举常量:RED、GREEN和BLUE。带有构造函数和方法的enum类型可以更方便的存储和获取枚举常量的信息。 总结:Javaenum类型是一种特殊的类型,它可以用来定义一组有限的常量,可以避免使用常 ### 回答2: Java中的enum类型是一种特殊的数据类型,它用于定义一组常量。常量是指在程序运行期间不会改变的值。枚举类型可以以更简洁和可读性好的方式来表示一组相关常量。 枚举类型Java中由关键字enum来定义,它能够包含一个或多个枚举常量。每个枚举常量都拥有自己的名称和值。我们可以通过枚举常量的名称来引用它们,并且无法对枚举常量进行更改。 枚举类型可以具有方法、构造函数和字段,就像普通的Java类一样。使用enum定义的枚举类型默认继承自java.lang.Enum类。此外,枚举类型还可以实现接口,从而使枚举常量能够具备更多的行为。 枚举类型Java中的应用非常广泛,它主要用于定义一组固定的常量,例如季节、星期几、颜色等。我们可以通过enum类型提供的方法来遍历枚举常量,比如values()方法可以返回枚举类型的所有常量,valueOf()方法可以根据常量名获取枚举常量。 使用枚举类型有许多好处,它可以提供更好的类型安全性,避免了使用原始类型常量的麻烦。此外,枚举类型在编码过程中也可以增加可读性,并且它们的实例是线程安全的。 总之,Java中的enum类型是一种非常有用的特性,它提供了一种更好的方式来定义和使用常量。通过使用enum类型,我们可以让代码更具可读性和可维护性。 ### 回答3: Javaenum类型是一种特殊的数据类型,用于定义一组常量。枚举类型可以认为是一个固定值的集合,比如一周的天数或是一年的季节。 在Java中,使用关键字enum来定义一个枚举类型。枚举类型中的每个常量都是唯一且有固定值的,它们可以通过枚举类型的名称来访问。 枚举类型的定义方式如下: enum Season { SPRING, SUMMER, AUTUMN, WINTER } 在上面的代码中,定义了一个名为Season的枚举类型,其中包含了四个常量:SPRING、SUMMER、AUTUMN和WINTER。 枚举类型可以用于switch语句中,让代码更加简洁和易读。例如: Season season = Season.SUMMER; switch (season) { case SPRING: System.out.println("春天"); break; case SUMMER: System.out.println("夏天"); break; case AUTUMN: System.out.println("秋天"); break; case WINTER: System.out.println("冬天"); break; } 除了常量之外,枚举类型还可以有构造方法、成员变量和成员方法。可以通过修改枚举类型的构造方法来给每个常量赋予不同的属性。 总之,Javaenum类型是一种方便、灵活且易于使用的数据类型,适用于定义一组固定值的常量。通过使用枚举类型,可以提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值