枚举类

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


点赞 0

文章评论

欢迎您:

纸上得来终觉浅,绝知此事要躬行!

112 文章 70349 浏览 3 评论

联系我

  •   QQ:    361352119
  •  Email:  lisimmy@sina.com
  • 微信: