猿来绘Java-42-枚举类的使用

枚举类的理解

如果类的对象只有一个,可以考虑使用单例模式,当需要定义一组常量时,强烈建议使用枚举类,枚举类的对象只有有限个,确定的。

举例如下:星期类、性别类、季节类、订单状态类、线程状态类等。

自定义枚举类

类似单例模式定义类的方式,我们自定义枚举类的时候考虑如下几种情况:

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

猜你喜欢

转载自blog.csdn.net/asdfjklingok/article/details/118087267
今日推荐