文章目录
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂!
GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual
搜索关注微信公众号“码出Offer”,送你学习福利资源!
深入理解Java枚举
一、什么是枚举
1.1 什么是枚举?
至于枚举,我们先拿生活中的枚举来入手,然后再引申Java中的枚举,其实它们的意义很相似。
谈到生活中的枚举,假如我们在玩掷骰子的游戏,在我们手中有两个骰子,要求掷出两个骰子的点数和必须大于6的概率,那么在此情此景,我们就需要使用枚举法一一列举出骰子点数的所有可能,然后根据列举出来的可能,求出概率。
可能有的小伙伴发现,这就是数学啊?这就是数学中的概率学和统计学。对,我们的枚举法就是常用于概率统计中的。
1.2 Java中的枚举类
Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug,方便很多场景使用。
二、Java枚举的语法
枚举类中的声明
访问修饰符 enum 枚举名 {
枚举成员,
枚举成员,
...
};
class类中枚举的声明
访问修饰符 class 类名 {
enum 枚举名 {
枚举成员,
枚举成员,
...
}
}
三、Java枚举类的使用规则和应用场景
3.1 Java枚举类的使用规则
至于枚举你也有所了解了,Java中的枚举也是一样的。而Java中枚举类的使用,也有特定的规则和场景。如果你看了以下的规则不明白的话,没有关系,继续向下学你就会明白,因为我在下面都会有讲解到这些规则。如下几个规则:
- 类的对象是确定的有限个数。
- 当需要定义一组常量时,建议使用枚举。
- 如果枚举类中只有一个对象,则可以作为单例模式的实现方法。
- 枚举类不能被继承
- 枚举类不能被单独的new创建对象
- 枚举类中的枚举成员是用
,
隔开的,多个枚举成员之间用_
隔开- 如果枚举类中的只有一个或多个枚举成员,其他什么都没有,我们在用
,
隔开的同时。最后可以省略;
结束符。注意: 如果关于枚举单例设计模式不太了解的小伙伴可以参考深度学习单例设计模式一文,你肯定会有意想不到收获,请相信我!
3.2 Java枚举类的应用场景
根据Java中使用枚举类的规则,有以下几种场景适合来使用枚举类,如下:
- 星期: Monday(星期一)、Tuesday(星期二)、Wednesday(星期三)、Thursday(星期四)、Firday(星期五)、Saturday(星期六)、Sunday(星期日)
- 性别: Man(男)、Woman(女)
- 季节: Spring(春天)、Summer(夏天)、Autumn(秋天)、Winter(冬天)
- 支付方式: Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
- 订单状态: Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已确认)
- 线程状态: Establish(创建)、Ready(就绪)、Run(运行)、Obstruct(阻塞)、Die(死亡)
- 等等…
四、枚举类的基本使用步骤解析
那我们就解释以下这两个规则,我们在上述中已经了解了枚举的作用。Java中枚举也不例外,也是一一列举出来方便我们拿出来一个或多个使用。这有点像我们的多选框,我们把需要用到的所有选项内容放在各个多选框后面,当我们在使用的时候只需要勾选自己需要的勾选框即可,这就代表了我们需要被选中多选框后面的内容。
那么,Java中的枚举类是如何使用呢?
这里我们简单的模拟一个场景,假设你的女朋友十分的喜欢喝点冷饮或热奶茶之类的饮品,在生活中也有很多像蜜雪冰城等等这种类型的饮品店。当你为女朋友买她爱喝的珍珠奶茶时,服务员会问你,要大杯、中杯还是小杯的。当然,为了满足女朋友,你通常会选择大杯。这就意味着店内不允许顾客点规则外的饮品。
注意: 如果你是初学者或是不了解枚举类的使用,此基本使用不懂没有关系,请继续往下看即可!
于是,我用Java代码来实现一下,上述场景。
首先,创建枚举类。分别为珍珠奶茶添加大、中、小杯杯型。
package com.mylifes1110.java;
/**
* @ClassName PearlMilkTea
* @Description 为珍珠奶茶添加三个杯型:大、中、小
* @Author Ziph
* @Date 2020/6/8
* @Since 1.8
*/
public enum PearlMilkTea {
//注意:这里枚举类中只有枚举成员,我在此省略了;结束符
SMALL, MEDIUM, LARGE
}
其次,创建珍珠奶茶对象,再有方法来判断枚举类中的大、中、小杯。最后打印女朋友喝哪个杯型的珍珠奶茶!
package com.mylifes1110.test;
import com.mylifes1110.java.PearlMilkTea;
/**
* @ClassName PearlMilkTeaTest
* @Description 为女朋友买哪个杯型的珍珠奶茶(默认大杯)
* @Author Ziph
* @Date 2020/6/8
* @Since 1.8
*/
public class PearlMilkTeaTest {
public static void main(String[] args) {
//创建大杯的珍珠奶茶对象
PearlMilkTea pearlMilkTea = PearlMilkTea.LARGE;
PearlMilkTeaTest.drinkSize(pearlMilkTea);
}
//判断为女朋友买哪个杯型的珍珠奶茶
public static void drinkSize(PearlMilkTea pearlMilkTea) {
if (pearlMilkTea == PearlMilkTea.LARGE) {
System.out.println("我为女朋友买了一大杯珍珠奶茶!");
} else if (pearlMilkTea == PearlMilkTea.MEDIUM) {
System.out.println("我为女朋友买了一中杯珍珠奶茶!");
} else {
System.out.println("我为女朋友买了一小杯珍珠奶茶!");
}
}
}
虽然,我们了解了枚举类中的基本使用,但是我们在语法中还介绍了一种在类中定义的枚举。正好,在此也演示一下。如下:
public class PearlMilkTea {
enum DrinkSize {
SMALL,
MEDIUM,
LARGE
}
}
如果这样创建就可以在class类中去创建enum枚举类了。想想前面例子中的代码其实并不合理,这是为什么呢?因为我们写代码要遵循单一职责原则和见命知意的命名规范。所以,我写的代码是在珍珠奶茶的枚举类中列举的大、中、小的三种杯型枚举成员。所以根据规范来讲,我们珍珠奶茶中不能拥有杯型相关的枚举,毕竟我们在生活中的这类饮品店中喝的所有饮品种类都有这三种杯型,因此我们的所有饮品种类中都需要写一个枚举类,显然这是很不合理的。
如果让它变的更加合理化,我们就细分饮品种类来创建饮品枚举类和杯型的枚举类并分别两两适用即可。也许有小伙伴会问我为什么我要说这些合理不合理呢?因为自我感觉这是对枚举类应用的思想铺垫,所以你品、你细品!
五、自定义枚举类
5.1 自定义枚举类步骤
关于第四章枚举类的基本使用,也许小伙伴们对枚举的陌生,而并不知道为什么这样去创建枚举对象。接下来,我来带你使用常量来自定义枚举类,试试是不是那个效果。
既然,上述第三章我举出了这么多枚举类的应用场景,那我们挑选一个比较经典的春夏秋冬来实现自定义枚举类。
首先,我们先创建一个季节类,分别提供属性、私有构造器、春夏秋冬常量、Getter方法和toString方法,步骤如下:
package com.mylifes1110.java;
/**
* 自定义季节的枚举类
*/
public class Season {
//声明Season对象的属性,为private final修饰
private final String seasonName;
//私有化构造器,并为对象赋值
private Season(String seasonName) {
this.seasonName = seasonName;
}
//提供当前枚举的多个对象,为public static final修饰
public static final Season SPRING = new Season("春天");
public static final Season SUMMER = new Season("夏天");
public static final Season AUTUMN = new Season("秋天");
public static final Season WINTER = new Season("冬天");
//提供外界通过getter方法来获取枚举对象的属性
public String getSeasonName() {
return seasonName;
}
//重写toString方法,以便打印出枚举结果
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
'}';
}
}
其次,我们去创建一个测试类,来使用该自定义枚举类创建对象。由此看来&#x