但是一个类究竟创建多少个工具,并且工具代表的值我们是无法限定的
以是,如果开拓中须要一组值,须要的数据是明确的,就可以利用列举
列举类是一种分外形式的Java类,列举类的工具个数是有限且明确的。比如:

星期:Monday(星期一)…Sunday(星期天)
性别:Man(男)、Woman(女)
时令:Spring(春天)…Winter(冬天)
支付办法:Cash(现金)、WeChatpay(微信支付)、AliPay(支付宝支付)、BankCard(银行卡支付)、CreditCard(信用卡支付)
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已收货)
以是,如果当我们须要定义一组常量表示不同的状态时,就建议利用列举类
JDK5以前是须要自定义列举类的,JDK5往后可以利用关键字enum来定义列举类
我们先来用传统class的办法来实现自定义列举类:
3 自定义列举类列举类中声明的每一个列举值代表列举类的一个实例工具
与Java中的普通类一样,在声明列举类时,也可以声明属性、方法和布局函数
但是列举类的布局函数必须为私有的,我们一起来练习一下:
package cn.cxy.exec;
/本类用于自定义列举类/
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING.getSEASON_NAME());//春季
System.out.println(Season.SUMMER.getSEASON_DESC());//夏日炎炎
System.out.println(Season.AUTUMN);
//Season{SEASON_NAME='秋季', SEASON_DESC='天高气爽'}
}
}
//1.自定义列举类
class Season{
//2.定义本类的私有属性,为了防止值被修正,须要设置为final
private final String SEASON_NAME;//时令名
private final String SEASON_DESC;//时令描述
//3.私有化本类的布局方法--防止外界随意创建本类工具
private Season(String seasonName,String seasonDesc){
this.SEASON_NAME = seasonName;//在布局中给本类的属性赋值
this.SEASON_DESC = seasonDesc;
}
//4.供应当前列举类的多个工具
public final static Season SPRING = new Season("春季","春暖花开");
public final static Season SUMMER = new Season("夏季","夏日炎炎");
public final static Season AUTUMN = new Season("秋季","天高气爽");
public final static Season WINTER = new Season("冬季","冬雪凛凛");
//5.天生对应的get的方法,获取本类的两个属性值
public String getSEASON_NAME() {
return SEASON_NAME;
}
public String getSEASON_DESC() {
return SEASON_DESC;
}
//6.天生toString方法方便查看
@Override
public String toString() {
return "Season{" +
"SEASON_NAME='" + SEASON_NAME + '\'' +
", SEASON_DESC='" + SEASON_DESC + '\'' + '}';
}
}
4 利用关键字enum定义列举类package cn.cxy.exec;
/本类用于利用enum关键字定义列举类/
public class ColorTest {
public static void main(String[] args) {
//6.进行测试
System.out.println(403 Forbidden);//RED
System.out.println(Color.ORANGE.getCOLOR_NAME());//橙色
System.out.println(Color.ORANGE.getCOLOR_NUMBER());//2
}
}
//1.利用enum关键字定义列举类
enum Color {
//2.写出本类对应的多个列举工具
/1.public static final可以省略不写
2.列举工具不能像自定义列举类工具时new,要按照下面的语法:
列举名1(值1,值2),列举名2(值1,值2),列举名3(值1,值2);
3.不须要天生toString,由于利用enum关键字定义的列举类继续了java.lang.Enum
在Enum中重写了继续自Object的toString(),直接打印的便是列举名/
RED("赤色",1),
ORANGE("橙色",2),
YELLOW("黄色",3),
GREEN("绿色",4),
CYAN("青色",5),
BLUE("蓝色",6),
PURPLE("紫色",7);
//3.定义列举类的多个私有属性
private final String COLOR_NAME;
private final int COLOR_NUMBER;
//4.定义本类的布局方法
private Color(String colorName, int colorNumber) {
this.COLOR_NAME = colorName;
this.COLOR_NUMBER = colorNumber;
}
//5.天生属性对应的两个get()
public String getCOLOR_NAME() {
return COLOR_NAME;
}
public int getCOLOR_NUMBER() {
return COLOR_NUMBER;
}
}
总结:
1.public static final可以省略不写
2.列举工具不能像自定义列举类工具时new,要按照下面的语法:
列举名1(值1,值2),列举名2(值1,值2),列举名3(值1,值2);
3.不须要天生toString,由于利用enum关键字定义的列举类继续了java.lang.Enum
在Enum中重写了继续自Object的toString(),直接打印的便是列举名
5 实现接口的列举类列举类也可以实现接口、或继续抽象类,有两种实现方案:
方案一:列举类与接口建立实现关系,在列举类中实现接口中定义的抽象方法
效果:每个列举工具调用实现后的方法都是同一个效果
方案二:列举类与接口建立实现关系,在列举类每个列举工具后分别实现抽象方法
效果:不同的列举工具调用实现后的方法便是不同的效果
package cn.cxy.exec;
/本类用于实现列举实现接口/
public class TestGame {
public static void main(String[] args) {
//8.进行测试
Game.ROCK.show();//猜丁壳出的是石头
Game.SCISSORS.show();//猜丁壳出的是剪刀
Game.PAPER.show();//猜丁壳出的是布
System.out.println(Game.ROCK.getName());//石头
System.out.println(Game.ROCK.getNum());//0
}
}
//6.定义接口与接口中的抽象方法
interface Info{
void show();
}
//1.通过enum关键字定义列举类
enum Game implements Info{
//2.列出本类的列举工具
ROCK("石头",0){
//7.2在每个列举工具后实现接口的抽象方法
public void show() {
System.out.println("猜丁壳出的是石头");
}
},
SCISSORS("剪刀",2){
public void show() {
System.out.println("猜丁壳出的是剪刀");
}
},
PAPER("布",5){
public void show() {
System.out.println("猜丁壳出的是布");
}
};
//3.定义本类的属性
private final String name;
private final int num;
//4.创建本类的布局函数
private Game(String name,int num){
this.name = name;
this.num = num;
}
//5.天生属性对应的get()
public String getName() {
return name;
}
public int getNum() {
return num;
}
//7.1列举实现接口抽象方法,方案一
// @Override
// public void show() {
// System.out.println("猜丁壳游戏~");
// }
}
6 Enum类的紧张方法String name() 返回此列举常量的名称,在其列举声明中对其进行声明
int ordinal() 返回列举常量的序数(它在列举声明中的位置,个中初始常量序数为零)
static <T extends Enum> T valueOf(Class enumType, String name)
返回带指定名称的指定列举类型的列举常量
values()此方法虽然在JDK文档中查不到,但是每个列举类都具有该方法,它用于遍历列举的所有列举值
package cn.cxy.exec;
import org.junit.Test;
import java.util.Arrays;
public class TestScore {
//测试列举的常用方法
@Test
public void test3() {
//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));
}
}
//1.利用enum关键字定义列举类
enum Score {
//2.列出本类的多个列举工具
A("100-80") {
//7.给每个列举工具实现刚刚步骤6定义的抽象方法
public String localeScore() {
return "优";
}
}, B("79-60") {
public String localeScore() {
return "中";
}
}, C("59-0") {
public String localeScore() {
return "差";
}
};
//3.定义一个私有的属性,封装每个工具对应的分数
private final String score;
//4.定义一个私有的布局函数
private Score(String score) {
this.score = score;
}
//5.定义一个输出成绩的抽象方法
public abstract String localeScore();
//6.定义一个公共的获取成绩的方
public String getScore() {
return this.score;
}
}
把稳1:如果列举类中只有一个工具,则可以看做单例模式的一种实现办法
enum A {//相称于定义了一个类 class A;
A;//相称于创建了这个类唯一的一个工具new A(); 类似于单例设计模式
}
把稳2:JDK5中扩展了switch语句,除了可以吸收byte short char int ,还可以吸收列举类型
7 作业需求:编写一个关于星期几的列举WeekDay
哀求:列举值:MON,TUE,WED,THR,FRI,SAT,SUN
该列举要有一个方法,调用该方法返回中文格式的星期几
package cn.tedu.oop;
import org.junit.Test;
public class Demo2 {
@Test
public void test(){
//6.1拿到指定的列举名
System.out.println(WeekDay.MON);//MON
//6.2拿到指定的列举名对应的值
System.out.println(WeekDay.MON.getValue());//星期一
}
}
//1.定义列举类
enum WeekDay {
//2.定义列举类中的列举与其对应的值
MON("星期一"), TUE("星期二"), WES("星期三"), THR("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");
//3.定义列举类中的私有属性
private String day;
//4.定义列举类的布局函数
private WeekDay(String day) {
this.day = day;
}
//5.定义列举类的方法,并获取列举对应的值
public String getValue(){
return this.day;
}
}