欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

枚举类学习

程序员文章站 2022-05-12 11:34:03
...
  1. 什么是枚举类?
    类的实例个数是有限的,但又不是很多。
  2. JDK1.5之前如何定义枚举类?
package com.prosay.demo1;

/**
 * 季节的枚举类
 * 某个类的实例个数有限(说明类的构造方法不能随意被外部调用),但又不是很多。
 * JDK1.5之前如何自定义枚举类
 * JDK1.5之后才有Enum
 * @author may
 *
 */
public class Season {

    //3.如何得到这个类的实例?实例个数设置为类的常量
    public final static Season SPRING =new Season("春天",1);
    public final static Season SUMMER =new Season("夏天",2);
    public final static Season FAIL =new Season("秋天",3);
    public final static Season WINTER =new Season("东天",4);

    //2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
    private final String name;
    private final int value;
    //1.私有化构造方法
    private Season(String name,int value) {
        this.name=name;
        this.value=value;
    }

    //4.需要get,set方法么?不需要set,需要get
    public String getName() {
        return name;
    }
    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Season [name=" + name + ", value=" + value + "]";
    }


}

3.JDK1.5之后如何定义枚举类?

package com.prosay.demo1;

/**
 * JDK1.5后声明枚举类
 * 
 * @author may
 *
 */
public enum SeasonEnum {

    // 3.如何得到这个类的实例?实例个数设置为类的常量
    SPRING("春天", 1), SUMMER("夏天", 2), FAIL("秋天", 3), WINTER("东天", 4);

    // 2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
    private final String name;
    private final int value;

    // 1.私有化构造方法
    private SeasonEnum(String name, int value) {
        this.name = name;
        this.value = value;
    }

    // 4.需要get,set方法么?不需要set,需要get
    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }

}

4.自定义枚举类和使用Enum声明的枚举类有什么区别?
       使用Enum声明的枚举,反编译后发现是final修饰的class,所以他不可以有子类,默认继承java.lang.Enum类,所以使用Enum声明的枚举不能再继承其他类,java中不允许多继承。而用class自定义的枚举类可以继承另外一个类,还可以实现其它接口。

5.枚举类和常量类有什么区别?

package com.prosay.demo1;

/**
 * 既然编译后的Enum类中使用的实质是常量,那么Enum类和常量类的区别是什么?
 * 
 * @author may
 *
 */
public class Test {

    public final static String SPRING = "春天";
    public final static String SUMMER = "夏天";
    public final static String FAIL = "秋天";
    public final static String WINTER = "东天";

    public static void main(String[] args) {

        Season s1 = Season.SPRING;
        System.out.println(s1);

        s1 = Season.SUMMER;

        SeasonEnum sEnum = SeasonEnum.WINTER;
        System.out.println(sEnum);

        fun("东边");// 使用其他类型无法控制实参取值
        // fun2("东边"); 编译的时候就能够检测到实参是否合法
        fun2(SeasonEnum.SPRING);
    }

    public static void fun(String s) {
        System.out.println(s);
    }

    // 使用枚举作为形式参数,可以控制调用方法时传递的实际参数的值
    public static void fun2(SeasonEnum s) {
        System.out.println(s);
    }

}

6.枚举底层的实现原理?
       可通过反编译来查看底层实现原理:
枚举类学习

7.枚举类的常用方法有哪些?

package com.prosay.demo1;

/**
 * 枚举类中有哪些常用方法?
 * 
 * @author may
 *
 */
public class TestEnumMethod {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DirectionEnum dEnum = DirectionEnum.valueOf("UP");
        System.out.println(dEnum);
        dEnum = dEnum.valueOf(DirectionEnum.class, "LEFT");
        System.out.println(dEnum);

        System.out.println(DirectionEnum.getInfo());
        System.out.println(DirectionEnum.getEnumByDesc("向左"));
        // System.out.println(DirectionEnum.getInfo());
    }

}

enum DirectionEnum {
    UP("向上", 1), DOWN("向下", 2), LEFT("向左", 3), RIGHT("向右", 4);
    private final String desc;
    private final int value;

    private DirectionEnum(String desc, int value) {
        this.desc = desc;
        this.value = value;
    }

    public String toString() {
        return desc + "_" + value;
    }

    // 如何获取枚举类中所有枚举值
    public DirectionEnum[] getAllDirectionEnum() {
        return DirectionEnum.values();
    }

    public static String getInfo() {
        StringBuffer sb = new StringBuffer();
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            sb.append(d.toString()).append("#");
        }
        return sb.toString();
    }

    public int getValue() {
        return this.value;
    }

    public String getDesc() {
        return this.desc;
    }

    // 通过枚举值得某个属性获取枚举对象,比如由1得到运动方向值
    public static DirectionEnum getEnumByValue(int value) {
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            if (d.getValue() == value) {
                return d;
            }
        }

        throw new IllegalArgumentException("没有这个方向,参数异常!");
    }

    public static DirectionEnum getEnumByDesc(String desc) {
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            if (d.getDesc().equals(desc)) {
                return d;
            }
        }

        throw new IllegalArgumentException("没有这个方向的描述,参数异常!");
    }
}

8.switch语句后面可以使用哪些数据类型?

package com.prosay.demo1;

/**
 * switch语句后面可以是什么数据类型? byte,short,char,int (这些类型都可以自动转换为int类型) 
 * JDK1.5以后可以是enum(ordinal,该方法实际上是返回一个int类型的数组)
 * JDK1.7以后是String (常量池,实际上也是转换为整数进行处理)
 * 
 * @author may
 *
 */
public class TestSwitchUseEnum {

    public static void main(String[] args) {

        SeasonEnum seasonEnum = SeasonEnum.SPRING;

        switch (seasonEnum) {

        case SPRING:
            System.out.println("春天来了,你可以种个对象了!");
            break;
        case SUMMER:
            System.out.println("夏天来了,你可以去游泳了!");
            break;
        case FAIL:
            System.out.println("秋天来了,你可以收获对象了!");
            break;
        case WINTER:
            System.out.println("栋天来了,你可以找个对象了!");
            break;
        default:
            break;
        }
        int order = seasonEnum.ordinal();
        System.out.println(order);

    }

}

9.如何利用枚举一句话实现单列模式?

package com.prosay.demo1;

public enum A {
    INSTANCE;
    public void say() {
        System.out.println("666");
    }
}
相关标签: enum