文章目录
一、什么是枚举?
介绍:java中枚举类属于一种特殊的数据类型,用于定义一组常量。枚举类型可以帮助我们组织和管理相关的常量,使得代码更加清晰、可读性更强。
**枚举核心:**枚举的核心是将一组相关的常量封装在一个类型安全的枚举中,使得代码更加清晰、可读、可维护,同时提供了更多类型安全的保障。在实际开发中,枚举常常用于表示一组相关的常量,例如表示一周的天数、表示颜色、表示状态等等
二、枚举的进化史
-
进化起步:定义一个普通的类,其他什么都不做
-
进化中:定义一个普通类,但是类中有许多被private final static修饰的本类的对象,如:
public class Grade {
private String value ;
// 私有化构造方法,不允许在类外实例化对象
private Grade() {}
private Grade(String value) {
this.value = value ;
}
// 实现化三个对象
public static final Grade A = new Grade("优秀");
public static final Grade B = new Grade("良好");
public static final Grade C = new Grade("中等");
@Override
public String toString() {
return this.value;
}
}
- 进化完成:出现枚举类,如:获取枚举常量和获取静态变量时的方法一样
public enum Grade {
// 定义枚举常量
A("优秀"),
B("良好"),
C("中等");
// 定义属性:表示等级ABCDE对应的中文表示
private String value ;
/**
* 构造方法
* @param value
*/
private Grade(String value) {
this.value = value ;
}
}
在枚举类中,可以放入抽象方法,定义常量时需要重写方法,如:
public enum Grade {
// 定义枚举常量
A("优秀"){
@Override
public String getScoreRange() {
return "分数>=90 && 分数<=100";
}
},B("良好"){
@Override
public String getScoreRange() {
return "分数>=80 && 分数<90";
}
},C("中等"){
@Override
public String getScoreRange() {
return "分数>=70 && 分数<80";
}
};
// 定义属性:表示等级ABCDE对应的中文表示
private String value ;
/**
* 构造方法
* @param value
*/
private Grade(String value) {
this.value = value ;
}
/**
* 定义抽象方法
* @return 返回不同等级的范围信息
*/
public abstract String getScoreRange() ;
}
三、枚举的语法
定义:
[访问修饰符] enum 枚举类名 {
// 枚举常量 - 枚举实例(枚举值)
// 成员变量、常量
// 成员方法、抽象方法、静态方法、重载方法、重写方法
// 构造方法
}
使用:
枚举类名.常量名
// 枚举类名.常量名的类型是枚举类
枚举类名 对象名 = 枚举类名.常量名;
四、枚举的API
准备实例:
public enum Color {
RED("红"),
GREEN("绿"),
BLUE("蓝");
private String value ;
private Grade(String value) {
this.value = value ;
}
public String getValue(){
return this.value;
}
}
1. name()
返回枚举常量的名称,正是因为在其枚举声明中声明。
Color color = Color.RED;
String name = color.name();
System.out.println(name);// 输出:RED
2. valueOf(String name)
根据枚举常量名称,返回枚举实例
Color color = Color.valueOf("RED");
System.out.println(color.getValue()); // 输出:红
3. values()
遍历枚举类所有的枚举值
Color[] colors = Color.values();
for (Color color : colors) {
System.out.println(color.name());
}
/*
输出:
RED
GREEN
BLUE
*/
注意:在Java中,枚举的values()方法和valueOf(String)方法非常特殊。这两个方法对于每个枚举类都是可用的,但它们不是从java.lang.Enum类继承来的,也不会在枚举类的代码中明显地看到它们的定义。这是因为这些方法是在编译时由Java编译器自动为每个枚举类隐式添加的。
4. valueOf(Class enumType, String name)
此方法返回具有指定名称的指定枚举类型的枚举常量
Color color = Enum.valueOf(Color.class,"RED");
System.out.println(color.getValue()); // 红
5. ordinal()
返回此枚举常量的序数(其枚举声明中的位置,其中初始常量被分配一个序号零)
Color color = Color.RED;
int ordinal = color.ordinal();
System.out.println(ordinal);//输出:0
6. compareTo()
比较两个枚举值常量序数之差
Color color = Color.RED;
int n = color.compareTo(Color.BLUE); //0 减 2
System.out.println(n); //输出:-2
五、举例
1. 实例一
enum Weekday {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday;
public boolean isWeekend() {
return this == Saturday || this == Sunday;
}
}
2. 实例二
public enum Role {
WARRIOR("战士", 100, 50, 30),
MAGE("法师", 80, 70, 20),
PRIEST("牧师", 60, 30, 50);
private String name; // 角色名称
private int hp; // 角色血量
private int attack; // 角色攻击力
private int defense; // 角色防御力
// 构造方法
private Role(String name, int hp, int attack, int defense) {
this.name = name;
this.hp = hp;
this.attack = attack;
this.defense = defense;
}
// getter方法
public String getName() {
return name;
}
public int getHp() {
return hp;
}
public int getAttack() {
return attack;
}
public int getDefense() {
return defense;
}
}
使用:
public class Player {
private Role role; // 玩家角色
public Player(Role role) {
this.role = role;
}
public void attack(Player target) {
int damage = this.role.getAttack() - target.getRole().getDefense();
if (damage > 0) {
int newHp = target.getRole().getHp() - damage;
target.getRole().setHp(newHp);
}
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}