枚举类的引入
如何自定义枚举类
枚举类的作用
如何使用关键字enum定义枚举类
Enum类的主要方法
实现接口的枚举类
- 枚举类的对象只能是有限个的,确定的。
- 举例如下: 星期:Monday(星期一)、......、Sunday(星期天)
- 性别:Man(男)、Woman(女)
- 季节:Spring(春节)......Winter(冬天)
- 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银 行卡)、CreditCard(信用卡)
- 就职状态:Busy、Free、Vocation、Dimission
- 订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、 Return(退货)、Checked(已确认)Fulfilled(已配货)、 线程状态:创建、就绪、运行、阻塞、死亡 。
枚举类的属性 :枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰 Ø枚举类的使用 private final 修饰的属性应该在构造器中为其赋值 ,若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的 传入参数
那么枚举类的具体作用是:
枚举(enmu),是指一个经过排序的,被打包成一个单一实体的项列表,一个枚举的实例可以使用枚举列表中的任意的单一的值,如下边的例子。这也是从jdk5之后引入的,在枚举之前如果想表示一组离散的特定的值,往往使用一些常量。例如:对于一年四季的表示针对下边所述的Season类,如果要进行各个对象的获取数据,从下边程序进行解读,一般采用Season spring = Season.SPRING;//通过类名去获取静态常量的值 String seasonDesc = spring.getSeasonDesc();//获得其属性这样一来客户端必须对这些常量去进一步的理解,才能了解如何去使用这个东西,就是说程序员使用的时候不去程序中看一下 都不知道这个参数如何去使用,如何调用。因为每个人都能够建立起自己的一种常量名代替参数值,那么问题来了,程序的可读性就更差了
私有化类的构造器,保证不能在类的外部创建其对象
2. 在类的内部创建枚举类的实例。声明为:public static final
3. 对象如果有实例变量,应该声明为private final,并在构造器中初始化。
public class seasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
String seasonDesc = spring.getSeasonDesc();
System.out.println(spring);
}
}
//定义一个枚举类
class Season{
//有限个确定的
//声明season对象的属性
private final String seasonName;//不能调用 不可变的
private final String seasonDesc;
//权限私有化 确定个数不能去多造
private Season( String seasonName,String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//提供当前枚举类的多个对象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("冬天","冰天雪地");
//其他诉求 获取枚举类的属性 可以提供get方法
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
枚举类和普通 Java 类一样,枚举类可以实现一个或多个接口 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只 要统一实现该方法即可。 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法Enum类的主要方法: values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的 枚举值。 valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符 串必须是枚举类对象的“名字”。如不是,会有运行时异常: illegalArgumentException。 toString():返回当前枚举类对象常量的名称
那么我们使用枚举类后我们使用values()方法去遍历数组输出,这样我们就不用每一次的去调用静态方法名参数来完成就相对比较好了。一下代码完成了 values()方法完成的遍历,tostring的方法我们这个程序中没有重写tosring方法,valueof(String str)方法都实现了,以及实现一个或多个接口。
用下面一个小程序来演示一下:
/**
* 三个方法
* 1.values方法
* 2.valuesof(string) 找指定名的对象的名字 根据提供的objname 返回枚举类对象的对象名
*/
public class SeasonTest1 {
//定义的枚举类 默认的string中的class java.lang.Enum tostring
public static void main(String[] args) {
Season1 spring=Season1.SPRING;
String seasonDesc = spring.getSeasonDesc();
System.out.println(spring.toString());
System.out.println("**************************");
// System.out.println(seasonDesc);//父类不是object
//System.out.println(Season1.class.getSuperclass());
Season1[] values = Season1.values();//枚举类的对象名出来 没有属性直接对象一摆 逗号隔开
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
values[i].show();
}
System.out.println("****************************");
Thread.State[] values1 = Thread.State.values();
for (int i = 0; i < values1.length; i++) {
System.out.println(values1[i]);
}
//valueof()方法中的字符串必须于枚举保持一致,然后就可以调用这个枚举中的方法。
Season1 spring1 = Season1.valueOf("SPRING");
System.out.println(spring1);
spring1.show();/*
SPRING
这是春节输出结果
*/
}
}
//定义一个接口
interface info{
void show();
}
//使用ennum关键字实现
enum Season1 implements info{
SPRING("春天","春暖花开"){
@Override//直接重写到枚举的对象中方便调用
public void show() {
System.out.println("这是春节");
}
},
SUMMER("夏天","夏日暖暖"){
@Override
public void show() {
System.out.println("宁静的夏天");
}
},
AUTUMN("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋天在哪里");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("大约在冬季");
}
};
private final String seasonName;//不能调用 不可变的
private final String seasonDesc;
//权限私有化 确定个数不能去多造
private Season1( String seasonName,String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
/* @Override//实现接口的方法
public void show() {
System.out.println("这是一个季节!");
}*/
}
//运行结果图:
枚举中的主要方法: