网站首页 > java教程 正文
枚举类型
从前面的数据类型章节可知 Java 中并没有枚举类型,但通过 Java API 中的 java.lang.Enum 枚举类我们可以定义枚举类型数据,本质上还是一个类类型。字符窜类型也是一样,通过 String 类生成,每一个双引号中的字符串编译后都会创建对应的字符串 String 对象。 为什么要定义枚举类型?有时后变量只会取几个确定值中的一个,这时枚举类型就很方便了,如定义一周的星期几:
public class Test {
// 定义一周日期
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
}
1.枚举类型的定义
通过关键字 enum 定义枚举类型数据,数据值一般采用大写。定义位置可以放在类中,类的外部,或者另外的文件中定义。

package test;
// 枚举数据
enum TestEnum
{
VALUE1, VALUE2
}
public class em
{
// 定义一周日期
enum Day
{
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
public static void main(String[] args)
{
System.out.println(Day.MONDAY); // 输出: Monday
System.out.println(TestEnum.VALUE1); // 输出: VALUE1
}
}
2.switch 操作
enum 支持 switch 操作。
package test;
public class em
{
enum Color
{
RED, YELLOW, GREEN
}
public static void main(String[] args)
{
Color cor = Color.RED;
switch (cor) {
case RED:
// do something
break;
case YELLOW:
// do something
break;
case GREEN:
// do something
break;
}
}
}
3.自定义枚举类
可以通过定制 Enum 类型来定义自己的枚举类。需要注意的是枚举类型的构造函数是私有的 private,所以不能通过 New 来创建枚举类型,正因如此才保证了枚举数据类型的安全,不会被更改。如:
定义一个 Color enum 类型
package test;
public enum Color
{
RED("红色", 1), YELLOW("黄色", 2), GREEN("绿色", 3);
private String name;
private int index;
Color(String name, int index)
{
this.name = name;
this.index = index;
}
public String getName()
{
return name;
}
public int getIndex()
{
return index;
}
}
使用Color 枚举类型
package test;
public class em
{
public static void main(String[] args)
{
// 获取枚举类型
Color cor = Color.GREEN;
// if 比较
if (cor.getIndex() == 3) {
System.out.println("当前是:" + cor.getName());
}
cor = Color.RED;
// switch 比较
switch (cor) {
case RED:
System.out.println("当前是:" + cor.getName());
break;
case YELLOW:
System.out.println("当前是:" + cor.getName());
break;
case GREEN:
System.out.println("当前是:" + cor.getName());
break;
default:
System.out.println("未获取到颜色类型");
break;
}
}
}
// 打印结果:
当前是:绿色
当前是:红色
4.相关枚举类
处理 enum 枚举类型,还有集合相关的枚举类型数据,如:EnumMap、EnumSet。
4.1 EnumMap 枚举型映射/字典
相当于 key 是枚举类型的映射。如:
EnumMap<Color, String> a = new EnumMap<>(Color.class);
a.put(Color.RED, "red");
a.put(Color.GREEN, "green");
System.out.println(a.get(Color.RED)); // 输出:red
System.out.println(a.get(Color.GREEN)); // 输出:green
System.out.println(a.toString()); // 输出:{RED=red, GREEN=green}
4.2 EnumSet 枚举集合
EnumSet 是个抽象类,不能实例化,查看源码发现有提供静态实例化 JumboEnumSet 或 RegularEnumSet 对象的方法。这两个对象继承自 EnumSet,区别在于 EnumSet 大小,大于 64 时创建的是 JumboEnumSet 对象,小于 64 时创建的是 RegularEnumSet 对象。源码如下:
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable
{
/**
* Creates an empty enum set with the specified element type.
*
* @param <E> The class of the elements in the set
* @param elementType the class object of the element type for this enum
* set
* @return An empty enum set of the specified type.
* @throws NullPointerException if <tt>elementType</tt> is null
*/
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
}
使用枚举集合:
package test;
import java.util.EnumSet;
public class em
{
public static void main(String[] args)
{
EnumSet<Color> cor = EnumSet.noneOf(Color.class);
cor.add(Color.RED);
cor.add(Color.YELLOW);
cor.add(Color.GREEN);
System.out.println(cor.toString());
for (Color c : cor) {
System.out.println("Index:" + c.getIndex() + " Name:" + c.getName());
}
cor.clear();
System.out.println(cor.toString());
}
}
// 打印结果
[RED, YELLOW, GREEN]
Index:1 Name:红色
Index:2 Name:黄色
Index:3 Name:绿色
[]
更多方法查看源码了解。EnumSet 是非线程安全的,要想线程安全使用 Collections.synchronizedSet() 处理EnumSet 对象,如:
Set<Color> s = Collections.synchronizedSet(EnumSet.noneOf(Color.class));
猜你喜欢
- 2024-10-06 关于Java中枚举Enum的深入剖析(java中枚举类型的使用)
- 2024-10-06 常用类及枚举类(一)(枚举类和普通类的区别)
- 2024-10-06 JAVA ---- 枚举/注解/反射(java中枚举的作用)
- 2024-10-06 深入剖析Java Enum类型(javaenum使用实例)
- 2024-10-06 Java enum——不一样的枚举对象(java 枚举使用)
- 2024-10-06 Java的enum的用法详解(java enum使用)
- 2024-10-06 学习廖雪峰的JAVA教程---java核心类(枚举类)
- 2024-10-06 Java枚举(JAVA枚举类型怎么用)
- 2024-10-06 java高级特性之泛型和枚举(java 泛型实现)
- 2024-10-06 java里枚举非常实用的3个方法,程序员一般都不注意
欢迎 你 发表评论:
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)

本文暂时没有评论,来添加一个吧(●'◡'●)