Java枚举

啥叫枚举?

一个一个的举例出来
前提:有限、确定

自定义枚举类(JDK 1.5之前)

在java中,类的对象是有限个,确定的。这个类我们可以定义为枚举类。
举例:
星期:一二三四五六日
性别:男女
季节:春夏秋冬

package com.lxg.enums;

/**
 * @author lxg
 * @description 季节枚举类
 * @date 2021/9/23
 */
public class Season {
    //属性
    private final String seasonName;//季节名称
    private final String seasonDesc;//季节描述
    //利用构造器对属性进行赋值操作,并将构造器私有化,外界不能调用这个构造器,只能season内部自己调用
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //提供枚举类有限的、确定的对象
    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("冬天","冰天雪地");

    //额外因素
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

package com.lxg.enums;

/**
 * @author lxg
 * @description 测试类
 * @date 2021/9/23
 */
public class Test {
    public static void main(String[] args) {
        Season summer = Season.SUMMER;
        System.out.println(summer);
    }
}

使用enum关键字创建枚举类(JDK 1.5 之后)

定义枚举类

package com.lxg.enums;

/**
 * 使用关键字enum创建枚举类
 */
public enum Season2 {
    //提供枚举类有限的、确定的对象

    /**
     * enum 枚举类要求对象(常量)必须放在最开始的位置上
     * 多个对象之间使用逗号隔开,最后一个对象之后使用分号
     */
    SPRING("春天","春暖花开"),
    SUMMER("夏天","烈日炎炎"),
    AUTUMN("秋天","硕果累累"),
    WINTER("冬天","冰天雪地");


    //属性
    private final String seasonName;//季节名称
    private final String seasonDesc;//季节描述
   
    //利用构造器对属性进行赋值操作,并将构造器私有化,外界不能调用这个构造器,只能season内部自己调用
    private Season2(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    
    //额外因素
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
    
}

请添加图片描述

使用枚举类

package com.lxg.enums;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 * @author lxg
 * @description 测试类2
 * @date 2021/9/23
 */
public class Test2 {
    public static void main(String[] args) {
        Season2 winter = Season2.WINTER;
        System.out.println(winter);

        //enum关键子对应的枚举类上层父类是Java.lang.Enum
        //自定义的枚举类上层父类是Object
        System.out.println(Season2.class.getSuperclass().getName());
    }
}

在源码中经常看见下面这种形式代码,因为这个枚举类没有属性,构造器,toString,get方法都删掉不写,然后在常量中如下SPRING()都可以不写()变成了SPRING的形式。
看到的形态就只有常量(对象)名了。

package com.lxg.enums;

public enum Season3 {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

案例:

如Thread中的枚举类:State 定义如下

public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }

Enum 中常用方法

package com.lxg.enums;

/**
 * @author lxg
 * @description 测试类
 * @date 2021/9/23
 */
public class Test3 {
    public static void main(String[] args) {

        /**
         * 使用enum关键字创建的Season枚举类父类是java.lang.Enum,父类中的方法,子类可以
         * 拿来用,常用方法有一下部分:
         */

        //toString():获取对象名字
        Season3 autumn = Season3.AUTUMN;
        System.out.println(autumn);

        //values():返回枚举对象的数组
        Season3[] values = Season3.values();
        for (Season3 s:values) {
            System.out.println(s);
        }

        //valueOf():通过对象名获取枚举对象
        //注意:对象的名字必须写对,否则会抛出异常
        Season3 autumn1 = Season3.valueOf("AUTUMN");
    }
}

枚举类实现接口

定义一个接口

package com.lxg.enums;

public interface TestInterface {
    void show();
}

枚举类实现接口

package com.lxg.enums;

/**
 * 枚举类实现接口
 */
public enum Season4 implements TestInterface{
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;

    /**
     * 重写接口中的抽象方法
     */
    @Override
    public void show() {
        System.out.println("这是Season4");
    }
}

测试

package com.lxg.enums;

/**

  • @author lxg
  • @description 测试类
  • @date 2021/9/23
    */
    public class Test4 {
    public static void main(String[] args) {
    //所有的枚举对象,调用show()方法的时候都是一样的
    Season4.SPRING.show();
    Season4.SUMMER.show();
    Season4.AUTUMN.show();
    Season4.WINTER.show();
    }
    }

新需求:

要求每个对象调用show()方法结果不同该怎么搞?
如下:

package com.lxg.enums;


/**
 * 枚举类实现接口
 */
public enum Season4 implements TestInterface{
    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("冬天");
        }
    };

    /**
     * 重写接口中的抽象方法
     */
    /*@Override
    public void show() {
        System.out.println("这是Season4");
    }*/
}

在这里插入图片描述

实际应用

定义性别

package com.lxg.enums;

public enum Gender {,;
}

package com.lxg.enums;

/**
 * @author lxg
 * @description Person
 * @date 2021/9/23
 */
public class Person {

    private String name;
    private Gender sex;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Gender getSex() {
        return sex;
    }

    public void setSex(Gender sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                '}';
    }
}

package com.lxg.enums;

/**
 * @author lxg
 * @description 测试类
 * @date 2021/9/23
 */
public class Test5 {

    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(19);
        p.setName("lili");
        p.setSex(Gender.);//传入枚举类Gender的对象:-->在入口处对参数进行了限制
        System.out.println(p);
    }
}

过枚举结合switch处理

package com.lxg.enums;

/**
 * @author lxg
 * @description ceshilei
 * @date 2021/9/23
 */
public class Test6 {
    public static void main(String[] args) {
        Gender sex = Gender.;

        //switvh后面的()中可以放入枚举
        //switvh后面的():int、short、byte、char、String、枚举
        switch(sex){
            case:
                System.out.println("男孩");
                break;
            case:
                System.out.println("女孩");
            default:
                System.out.println("人妖");
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luo_xguan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值