枚举类的理解
如果类的对象只有一个,可以考虑使用单例模式,当需要定义一组常量时,强烈建议使用枚举类,枚举类的对象只有有限个,确定的。
举例如下:星期类、性别类、季节类、订单状态类、线程状态类等。
自定义枚举类
类似单例模式定义类的方式,我们自定义枚举类的时候考虑如下几种情况:
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);
}
}
enum定义枚举类
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方法
}
}
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
枚举类的对象可实现接口中的抽象方法
和普通 Java 类一样,枚举类可以实现一个或多个接口
若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法
一般性的做法:实现接口,并提供方法
//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();
}
}
}
枚举类中的每个对象都实现下抽象方法
//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();
}
}
}