网站首页 > 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 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)