枚举 enum

枚举

JDK1.5以后,引入了枚举(enum)enum是用来声明枚举类型数据

它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外,
其他类型的,如字母、特殊符号、汉字都可以任意组合存入enum中。

关于枚举有以下几点,

1、枚举是一个特殊的class,这个class相当于 final static 修饰,不能被继承

2、枚举的构造方法,强制被私有化,

3、所有的枚举都继承自java.lang.Enum类,由于java不持支多继承,所以枚举对象不能再继承其他类


1、枚举型常量

java中定义常量可以用 public static final XXX,也可以用枚举(enum),

public enum ColorEnum{
	// 每个枚举变量,都是枚举类CoolorEnum的实例,相当于 RED = new ColorEnum(1),按序号来

	// 每个成员变量都是final、static修饰的
	RED, GREEN, BLACK, WHITE;
}

public void test(){

	// 使用增强的for循环遍历 ColorEnum 的所有值,
	// ColorEnum.values()返回这个枚举类型的所有值的数组
	for(ColorEnum color: ColorEnum.values()){

		// color:当前遍历到的枚举值
		
		// color.ordinal():返回该枚举值在枚举中的位置(从0开始)

		/* 
			name()方法,是枚举类中每个枚举常量都有的一个方法,
			当你定义一个枚举类型时,每个枚举常量都会隐式地拥有一个 name() 方法,该方法返回该常量的名称。
			所以,
			color.name() 返回该枚举值常量的名称,即RED、GREEN、BLANK或YELLOW
			name()方法是一种非静态方法,只能通过类的实例对象访问,如果尝试使用类名称访问该方法,会报错
		*/

		System.out.println(color+",下标:"+color.ordinal()+",名字:"+color.name());
	}
}

2、带一个参数的枚举
public enum TypeEnum {
	FIREWALL('firewall');
	SECRET('secretMAC');
	BALANCE('f5');

	private String typeName;

	TypeEnum(String typeName){
		this.typeName = typeName;
	}

	public String getTypeName(){
		return this.typeName;
	}

	/**
	* 根据类型名称,返回类的的枚举实例
	* @param typeName 类型名称
	*/
	public static TypeEnum fromTypeName(String typeName){
		for(TypeEnum type: TypeEnum.values()){
			if(type.getTypeName().equalsIgnoreCase(typeName)){
				return type;
			}
		}
		return null;
	}
}

class Main {
	public void TypeTest(){
		String typeName = 'f5';

		TypeEnum type = TypeEnum.fromTypeName(typeName)
		
		if (type != null) {
			System.out.println(type + ",typeName:" + type.getTypeName() + ",下标:" + type.ordianl() + ',name:' + type.name());
		} else {
			System.out.println("No matching type found for name: " + typeName);
		}
	}

	public static void main(String[] args) {
        TypeTest();
    }
}

3、向枚举中添加新方法
public enum SensorEnum{
	// 设备类型,0温度,1压力,2湿度,3气体
    TEMP(0, "TEMP"), PRESS(1, "PRESS"),
    HMDT(2, "HMDT"), GAS(3, "GAS");
	
	private final int value;
	private final String desc;

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

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

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

	public static SensorEnum valueOf(int value) {
        switch (value) {
            case 0:
                return SensorEnum.TEMP;
            case 1:
                return SensorEnum.PRESS;
            case 2:
                return SensorEnum.HMDT;
            case 3:
                return SensorEnum.GAS;
            default:
                return null;
        }
    }
}


public class Main {
    public static void main(String[] args) {
        SensorEnum tempSensor = SensorEnum.TEMP;
        System.out.println("Sensor type: " + tempSensor.getDescription());
        System.out.println("Sensor value: " + tempSensor.getValue());

        // 通过值获取枚举实例
        SensorEnum gasSensor = SensorEnum.valueOf(3);
        System.out.println("Sensor type: " + gasSensor.getDescription());
        System.out.println("Sensor value: " + gasSensor.getValue());
    }
}

解释一下,

当执行 SensorEnum tempSensor = SensorEnum.TEMP; 时,

实际上是在创建一个枚举实例 tempSensor,并将其初始化为 SensorEnum.TEMP 这个枚举常量,

在这个过程中,

会调用 SensorEnum 的构造函数,并为 TEMP 这个枚举常量初始化相应的字段值,

因为在枚举类型中,构造函数是在定义枚举常量时自动调用的,

所以在执行 SensorEnum tempSensor = SensorEnum.TEMP; 这句代码时,

构造函数会被调用,然后将 tempSensor 初始化为 TEMP 枚举常量的值。

因此,在这个过程中,

构造函数 SensorEnum(int value, String desc) 会被调用,

然后将 tempSensorvaluedesc 字段初始化为 TEMP 枚举常量的值。

你可能感兴趣的:(java,java)