枚举(补充)

一、什么是枚举?

介绍:java中枚举类属于一种特殊的数据类型,用于定义一组常量。枚举类型可以帮助我们组织和管理相关的常量,使得代码更加清晰、可读性更强。

**枚举核心:**枚举的核心是将一组相关的常量封装在一个类型安全的枚举中,使得代码更加清晰、可读、可维护,同时提供了更多类型安全的保障。在实际开发中,枚举常常用于表示一组相关的常量,例如表示一周的天数、表示颜色、表示状态等等

二、枚举的进化史

  1. 进化起步:定义一个普通的类,其他什么都不做

  2. 进化中:定义一个普通类,但是类中有许多被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;
	}
}
  1. 进化完成:出现枚举类,如:获取枚举常量和获取静态变量时的方法一样
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值