JDK1.5以后,引入了枚举(enum)
,enum是用来声明枚举类型数据
,
它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外,
其他类型的,如字母、特殊符号、汉字都可以任意组合存入enum中。
1、枚举是一个特殊的class,这个class相当于 final static 修饰,不能被继承
2、枚举的构造方法,强制被私有化,
3、所有的枚举都继承自java.lang.Enum类,由于java不持支多继承,所以枚举对象不能再继承其他类
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());
}
}
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();
}
}
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)
会被调用,
然后将 tempSensor
的 value
和 desc
字段初始化为 TEMP
枚举常量的值。