枚举类
1-枚举类的介绍和使用
2021-07-07 447 0
简介 自定义枚举类以及使用enum关键字定义枚举类
1. 枚举类的理解
如果类的对象只有一个,可以考虑使用单例模式,当需要定义一组常量时,强烈建议使用枚举类,枚举类的对象只有有限个,确定的。
举例如下:星期类、性别类、季节类、订单状态类、线程状态类等。
星期: Monday(星期一)、 ......、 Sunday(星期天)
性别: Man(男)、 Woman(女)
季节: Spring(春节)......Winter(冬天)
支付方式: Cash(现金)、 WeChatPay(微信)、 Alipay(支付宝)、 BankCard(银行卡)、 CreditCard(信用卡)
就职状态: Busy、 Free、 Vocation、 Dimission
订单状态: Nonpayment(未付款)、 Paid(已付款) 、 Delivered(已发货)、Return(退货)、 Checked(已确认Fulfilled(已配货)、
线程状态:创建、就绪、运行、阻塞、死亡
2. 自定义枚举类
1.对象的属性:private final修饰,对象是常量了,属性那肯定也是常量
2.私有化类的构造器,并给对象属性赋值,类外无法调用构造器,也就是类外无法通过new的方式创建对象。
3.提供当前枚举类的多个对象:public static final的
4.可提供get方法和toString()方法
//StatusTest.java
package
com.ylaihui.enumtest;
class
Status{
private
final
String name;
private
Status(String name){
this
.name = name;
}
public
static
final
Status VALID =
new
Status(
"valid"
);
public
static
final
Status NONVALID =
new
Status(
"nonvalid"
);
public
String getName() {
return
name;
}
@Override
public
String toString() {
return
"Status{"
+
"name='"
+ name + '\
''
+
'}'
;
}
}
public
class
StatusTest {
public
static
void
main(String[] args) {
Status valid = Status.VALID;
System.out.println(valid);
Status nonvalid = Status.NONVALID;
System.out.println(nonvalid);
}
}
3.enum定义枚举类
使用说明
使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类
枚举类的构造器只能使用 private 权限修饰符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的
实例系统会自动添加 public static final 修饰
必须在枚举类的第一行声明枚举类对象
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定
1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
2.声明对象的属性:private final修饰
3.私有化类的构造器,并给对象属性赋值
4.可提供get方法和toString()方法
//EnumStatusTest.java
package
com.ylaihui.enumtest;
enum
EnumStatus{
VALID(
"valid"
),
NONVALID(
"nonvalid"
);
private
final
String name;
private
EnumStatus(String name){
this
.name = name;
}
public
String getName() {
return
name;
}
//@Override
//public String toString() {
// return "EnumStatus{" +
// "name='" + name + '\'' +
// '}';
//}
}
public
class
EnumStatusTest {
public
static
void
main(String[] args) {
EnumStatus valid = EnumStatus.VALID;
EnumStatus nonvalid = EnumStatus.NONVALID;
System.out.println(valid);
// VALID,调用了 Enum类中的toString方法
System.out.println(nonvalid);
// NONVALID 调用了 Enum 类中的toString方法
}
}
4. Enum类中常用的方法
Enum类的主要方法:
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
toString():返回当前枚举类对象常量的名称
//EnumMethodTest.java package com.ylaihui.enumtest; import java.util.Arrays; enum EnumStatus1{ VALID( "valid" ), NONVALID( "nonvalid" ); private final String name; private EnumStatus1(String name){ this .name = name; } public String getName() { return name; } //@Override //public String toString() { // return "EnumStatus{" + // "name='" + name + '\'' + // '}'; //} } public class EnumMethodTest { public static void main(String[] args) { //values() 方法 EnumStatus1[] values = EnumStatus1.values(); System.out.println(Arrays.toString(values)); for ( int i = 0 ; i <values.length; i++) { System.out.println(values[i]); } Thread.State[] values1 = Thread.State.values(); for ( int i = 0 ; i < values1.length; i++) { System.out.println( "Thread State: " + values1[i]); } //valueOf(String objName):返回枚举类中对象名是objName的对象。 Thread.State state = Thread.State.valueOf( "NEW" ); System.out.println(state); //IllegalArgumentException: No enum constant java.lang.Thread.State.DDD //Thread.State state1 = Thread.State.valueOf("DDD"); //System.out.println(state1); //toString():返回当前枚举类对象常量的名称 String s = state.toString(); System.out.println(s); } } |
代码输出:
[VALID, NONVALID]
VALID
NONVALID
Thread State: NEW
Thread State: RUNNABLE
Thread State: BLOCKED
Thread State: WAITING
Thread State: TIMED_WAITING
Thread State: TERMINATED
NEW
NEW
5.枚举类的对象分别实现接口中的抽象方法
和普通 Java 类一样,枚举类可以实现一个或多个接口
若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法
5.1 一般性的做法
实现接口,并提供方法
//EnumStatus.java
package
com.ylaihui.enumabstract;
interface
Desc{
public
void
show();
}
enum
Status
implements
Desc{
VALID(
"valid"
),
NONVALID(
"nonvalid"
);
private
final
String name;
private
Status(String name) {
this
.name = name;
}
@Override
public
void
show() {
System.out.println(
"enum Status: "
+
this
.name);
}
}
public
class
EnumStatus {
public
static
void
main(String[] args) {
Status[] values = Status.values();
for
(
int
i =
0
; i < values.length; i++) {
System.out.println(values[i]);
values[i].show();
}
}
}
5.2 枚举类中的每个对象都实现下抽象方法
//EnumStatus.java
package
com.ylaihui.enumabstractmethod;
interface
Desc{
public
void
show();
}
enum
Status
implements
Desc{
VALID(
"valid"
){
@Override
public
void
show() {
System.out.println(
"in object show : valid"
);
}
},
NONVALID(
"nonvalid"
){
@Override
public
void
show() {
System.out.println(
"in object show : nonvalid"
);
}
};
private
final
String name;
private
Status(String name) {
this
.name = name;
}
}
public
class
EnumStatus {
public
static
void
main(String[] args) {
Status[] values = Status.values();
for
(
int
i =
0
; i < values.length; i++) {
System.out.println(values[i]);
values[i].show();
}
}
}