Java 中的枚举

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));
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值