博客
关于我
JavaSE—枚举
阅读量:638 次
发布时间:2019-03-14

本文共 3588 字,大约阅读时间需要 11 分钟。

枚举(Enum)是一种在Java中定义常量的强类型,允许代码中使用这些常量来表示一系列有限的、互不相同的值。通过 enum 关键字,我们可以创建一个自定义的枚举类型,这样在代码中引用这些常量就不再是 String 或其他任意类型,而是具体的枚举类型。

1、枚举的常规用法

package test;
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class Test {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day.ordinal()); // 输出0
}
}

编译器会将枚举类型 Day 生成一个继承自 java.lang.Enum 的类,因此,你可以使用 ordinal() 方法获取枚举常量的序数。

2、枚举对象的方法

每个枚举常量都有 name()toString() 方法,调用这些方法会返回该常量的文本表示。例如:

Day.MONDAY.name(); // 返回"MONDAY"
Day.MONDAY.toString(); // 返回"MONDAY"

3、枚举的实际应用

枚举类型在实际开发中有很多用途,比如在 switch 语句中使用:

public class Test {
public enum Color {
RED, BLUE, GREEN
}
Color color = Color.RED;
public void change() {
switch (color) {
case RED:
color = Color.BLUE;
break;
case BLUE:
color = Color.GREEN;
break;
case GREEN:
color = Color.RED;
break;
}
}
}

4、实现自定义逻辑

如果你想为枚举常量添加额外功能,可以在 enum 常量的定义后面添加逻辑。例如:

public enum Color {
RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 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 int getIndex() {
return index;
}
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
@Override
public String toString() {
return super.toString();
}
}

你可以通过 ordinal()name() 方法访问枚举的序号和名称,还可以通过 compareTo() 方法比较两个枚举值的顺序。

5、枚举与接口结合使用

由于 Enum 类本身已继承自 java.lang.Enum,所以我们可以让枚举类型实现接口。例如:

interface Behaviour {
void print();
}
public enum Color implements Behaviour {
RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 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 int getIndex() {
return index;
}
@Override
public void print() {
System.out.print(index + ":" + name);
}
}
public class Test {
public static void main(String[] args) {
Color.BLUE.print(); // 输出"2:蓝色"
}
}

6、在接口中声明枚举

有时候,我们可能会把枚举类型定义在接口中,这样可以让所有实现该接口的类都共享相同的枚举值。例如:

interface Thing {
enum Mobile implements Thing {
SamSung("三星"), Apple("6");
private String type;
private Mobile(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
}
public class Test implements Thing {
public static void main(String[] args) {
System.out.println(Mobile.SamSung.getType());
}
}

7、枚举集合和映射

为了更高效地工作sWith枚举值,可以使用 java.util.EnumSetjava.util.EnumMap 这些辅助类。EnumSet 可以确保集合中仅包含枚举值,而 EnumMap 则可以使用枚举类型作为键。

例如:

import java.util.EnumSet;
import java.util.EnumMap;
public class Test {
public enum Direction { LEFT, RIGHT, UP, DOWN }
public static void main(String[] args) {
EnumSet
directions = EnumSet.of(Direction.LEFT, Direction.RIGHT);
System.out.println(directions); // 输出{LEFT, RIGHT}
EnumMap
map = new EnumMap
();
map.put(Direction.LEFT, "左");
map.put(Direction.RIGHT, "右");
System.out.println(map.get Direction.LEFT); // 输出"左"
}
}

转载地址:http://widlz.baihongyu.com/

你可能感兴趣的文章
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>