Java 中的枚举
本文仅作为个人复习学习,枚举知识点使用。
本篇大部分内容结合了 CSDN博主「程序媛 泡泡」文章,如有喜欢本文内容的读者,请前往原作者页面支持原作者
原文链接:https://blog.csdn.net/weixin_43884234/article/details/120808470
1. 枚举在哪里用?
Java是一门面向对象的语言,当我们创建好一个类以后,可以创建这个类的多个对象。
一个类究竟有多少对象,并且对象代表的值这个是无法限制的。
所以在开发中,如果需要一组值,且需要的数据是明确的,那么就可以使用枚举。
2. 枚举的概念
枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的。比如:
星期: Monday(星期一)----Sunday(星期日)
性别: Man(男性)----Woman(女性)
季节: Spring(春)----Winter(冬)
支付方式: Cash(现金)、WeChatpay(微信支付)、AliPay(支付宝支付)、BandCard(银行卡支付)、CreditCard(信用卡支付)
订单状态: Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已收货)
JDK5以前需要自定义枚举类,JDK5以后可以使用关键字 enum 来定义枚举类
2.1 自定义枚举类
package com.枚举.m;
/**
* @program: 编程区
* @description: 老版本 自定义枚举类 的方式
* @author: 白嫖怪AE
* @create: 2021-11-27 19:12
**/
public class Level {
// 提供当前枚举类的 多个对象
private static final Level LOW = new Level(1); // 定义 1 为低级
private static final Level MEDIUM = new Level(50); // 定义 50 为中级
private static final Level HIGH = new Level(100); // 定义 100 为高级
// 定义本类的私有属性
private int levelValue;
// 私有化本类的构造方法---- 防止外界随意创建本类对象
private Level(int levelValue) {
this.levelValue = levelValue; // 在构造中,给本类赋值
}
// 生成对应的get 方法,获取本类的属性值
public int getLevelValue() {
return levelValue;
}
} // Level 类
// 通过 main方法
public static void main(String[] args){
System.out.println(Level.LOW.getLevelValue()); // 1
System.out.println(Level.MEDIUM.getLevelValue()); //50
System.out.println(Level.HIGH.getLevelValue()); //100
}
2.2 关键字enum 创建枚举类
package 复盘.枚举;
/**
* 使用enum 关键字定义枚举
*
* */
public enum Season {
// 春夏秋冬
Spring("春天","春暖花开"),
Summer("夏天","夏日炎炎"),
Autumn("秋天","秋高气爽"),
Winter("冬天","冬雪凛凛");
// 定义枚举类的多个私有属性
private final String SEASON_NAME;
private final String SEASON_DESC;
// 定义构造方法 + private 修饰
private Season(String SEASON_NAME, String SEASON_DESC) {
this.SEASON_NAME = SEASON_NAME;
this.SEASON_DESC = SEASON_DESC;
}
//生成对应的get 方法
public String getSEASON_NAME() {
return SEASON_NAME;
}
public String getSEASON_DESC() {
return SEASON_DESC;
}
}
测试一下
public class SeasonTest {
public static void main(String[] args) {
//测试 Season 枚举类
System.out.println(Season.Spring.getSEASON_NAME()+":"+Season.Spring.getSEASON_DESC());
System.out.println(Season.Summer.getSEASON_NAME()+":"+Season.Summer.getSEASON_DESC());
System.out.println(Season.Autumn.getSEASON_NAME()+":"+Season.Autumn.getSEASON_DESC());
System.out.println(Season.Winter.getSEASON_NAME()+":"+Season.Winter.getSEASON_DESC());
//春天:春暖花开
//夏天:夏日炎炎
//秋天:秋高气爽
//冬天:冬雪凛凛
}
}
2.3 实现接口的枚举类
枚举类也可以实现接口、或继承抽象类,有两种实现方案:
方案一:枚举类与接口建立实现关系,在枚举类中实现接口中定义的抽象方法。
效果: 每个枚举对象调用实现后的方法都是同一个效果。
方案二: 枚举类与接口建立实现关系,在枚举类每个枚举对象后分别实现抽象方法。
效果:不同的枚举对象调用实现后的方法就是不同的效果。
先自定义枚举类实现接口
package 复盘.枚举;
/**
* 实现接口的枚举类
*/
// 定义接口与接口中的抽象方法
interface Info {
void show();
}
public enum Game {
// 在每个枚举对象后实现接口的抽象方法
ROCK("石头", 0) {
public void show() {
System.out.println("我出的石头");
}
}, SCISSORS("剪刀", 2) {
public void show() {
System.out.println("我出的剪刀");
}
}, PAPER("布", 5) {
public void show() {
System.out.println("我出的布");
}
};
// 定义枚举类的多个私有属性
private final String name;
private final int num;
Game(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public int getNum() {
return num;
}
public void show() {
}
} //enum
测试一下
package 复盘.枚举;
/**
* @program: 编程区
* @description: 测试 自定义Game 枚举类
* @author: 白嫖怪AE
* @create: 2021-11-28 14:47
**/
public class GameTest {
public static void main(String[] args) {
// 进行测试
Game.ROCK.show();
Game.SCISSORS.show();
Game.PAPER.show();
System.out.println(Game.ROCK.getName());
System.out.println(Game.ROCK.getNum());
//我出的石头
//我出的剪刀
//我出的布
//石头
//0
}
}
3. Enum 类的主要方法
//01-返回当前枚举值的名称
System.out.println(Score.B.name());//B
System.out.println(Score.B.toString());//B
//02-打印当前枚举值在枚举类中声明的顺序
System.out.println(Score.B.ordinal());//1,第2个枚举值
/*使用场景:
* 实际开发中表单提交过来的值是字符串类型,需要验证此字符串是否是我们定义的枚举值
* 如果可以转换,说明提交的字符串没有问题,是我们预先定义好的枚举值
* 如果不可以转换,说明提交过来的字符串有误,会报非法参数异常,没有这个枚举值*/
//03-将字符串转成对应的枚举类型,注意这个类型必须是已有的枚举值
//String str = "Cc";//IllegalArgumentException: No enum constant cn.tedu.oop.Score.Cc
String str = "C";
Score score = Score.valueOf(Score.class, str);
System.out.println(score);
//将字符串转成枚举类型的方式2,此种推荐,简单
System.out.println(Score.valueOf(str));
Score[] values = Score.values();
System.out.println(Arrays.toString(values));