您的位置 首页 java

Java进阶_枚举 enum

1 枚举引入

Java 是一门面向对象的语言,当我们创建好一个类以后,可以创建这个类的多个对象

但是一个类究竟创建多少个对象,并且对象代表的值我们是无法限制的

所以,如果开发中需要一组值,需要的数据是明确的,就可以使用枚举

2 枚举概念

枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的。比如:

星期:Monday(星期一)…Sunday(星期天)

性别:Man(男)、Woman(女)

季节:Spring(春天)…Winter(冬天)

支付方式:Cash(现金)、 WeChat pay(微信支付)、 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”;//IllegalArgument Exception : 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;

}

}

文章来源:智云一二三科技

文章标题:Java进阶_枚举 enum

文章地址:https://www.zhihuclub.com/194416.shtml

关于作者: 智云科技

热门文章

网站地图