枚举
可以将变量一一列举出来,变量的值只限于列举出来值的范围内;是一种特殊的数据类型。类比与单例模式,枚举是一个类的有限个实例。
例如:一周只有7天
自己实现枚举
无参
public class Sex01 {
public static final Sex01 BOY = new Sex01();
public static final Sex01 GIRL = new Sex01();
// 构造私有
private Sex01() {}
}
有参
public class Sex02 {
public static final Sex02 BOY = new Sex02("男");
public static final Sex02 GIRL = new Sex02("女");
// 构造私有
private Sex02(String name) {
this.name = name;
}
private String name;
public String getName() {
return this.name;
}
}
public class EnumTest {
public static void main(String[] args) {
String name = Sex02.BOY.getName();
System.out.println(name);
}
}
抽象方法
public abstract class Sex03 {
public static final Sex03 BOY = new Sex03("男") {
@Override
public void show() {
System.out.println("男");
}
};
public static final Sex03 GIRL = new Sex03("女") {
@Override
public void show() {
System.out.println("女");
}
};
// 构造私有
private Sex03(String name) {
this.name = name;
}
private String name;
public String getName() {
return this.name;
}
public abstract void show();
}
public class EnumTest {
public static void main(String[] args) {
String name = Sex03.BOY.getName();
System.out.println(name);
Sex03.BOY.show();
Sex03.GIRL.show();
}
}
枚举类
Java通过enum关键字来定义枚举类
无参
public enum SexEnun {
BOY, GIRL;
}
有参
public enum SexEnum {
BOY("男"), GIRL("女");
private SexEnum(String name) {
this.name = name;
}
private String name;
public String getName() {
return this.name;
}
}
抽象方法
public enum SexEnum {
BOY("男") {
@Override
public void show() {
System.out.println("男");
}
},
GIRL("女") {
@Override
public void show() {
System.out.println("女");
}
};
private SexEnum(String name) {
this.name = name;
}
private String name;
public String getName() {
return this.name;
}
public abstract void show();
}
注意事项
- 使用关键字enum来定义枚举类
- 所有枚举类都是Enum的子类
- 枚举类的第一行必须是枚举项
- 枚举类可以有构造器,但必须是private修饰的
常用方法
public enum Sex2Enum {
BOY(1, "男"),
GIRL(2, "女");
private Integer id;
private String name;
private Sex2Enum(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public static Sex2Enum getEnumById(Integer id) {
Sex2Enum[] values = Sex2Enum.values();
for (Sex2Enum value : values) {
if (value.getId() == id) return value;
}
return null;
}
}
-
name() 和 toString()
public class Sex2Test { public static void main(String[] args) { // BOY System.out.println(Sex2Enum.BOY.name()); // BOY System.out.println(Sex2Enum.BOY.toString()); } }
-
int ordinal
返回此枚举常数的序数,从0开始,随着枚举项的变化而变化,不是一成不变的
public class Sex2Test { public static void main(String[] args) { System.out.println(Sex2Enum.BOY.ordinal()); System.out.println(Sex2Enum.GIRL.ordinal()); } }
-
<T> T valueOf(Class<T> type, String name )
返回具有指定名称的指定枚举类型的枚举常量。
public static void main(String[] args) { Sex2Enum boy = Enum.valueOf(Sex2Enum.class, "BOY"); System.out.println(boy.getDesc()); System.out.println(boy.getId()); }
-
values()
返回枚举类所有枚举项的数组
public class Sex2Test { public static void main(String[] args) { Sex2Enum[] values = Sex2Enum.values(); for (Sex2Enum value : values) { System.out.println(value); } } }
switch中使用枚举
-
通过枚举项使用
public class Sex2Test { public static void main(String[] args) { Sex2Enum boy = Sex2Enum.BOY; switch (boy) { case BOY: System.out.println(Sex2Enum.BOY.getDesc()); break; case GIRL: System.out.println(Sex2Enum.GIRL.getDesc()); break; } } }
-
通过属性使用
public class Sex2Test { public static void main(String[] args) { Integer id = 2; switch (Sex2Enum.getEnumById(id)) { case BOY: System.out.println(Sex2Enum.BOY.getDesc()); break; case GIRL: System.out.println(Sex2Enum.GIRL.getDesc()); break; } } }