用法一:enum可以用作常量
public enum Meiju(){
a,b,c
}
用法二:enum可以和switch用
public enum Meiju(){
a,b,c
}
public class Demoswitch(){
public Meiju show(Meiju letter){
switch (letter) {
case RED:
letter = Meiju.a;
return letter;
case YELLOW:
letter = Meiju.b;
return letter;
case GREEN:
letter = Meiju.c;
return letter;
default:
System.out.println("输入错误");
break;
}
return null;
}
}
用法三:可以向enum中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
public enum Meiju {
A("a", 1), B("b", 2), C("c", 3), D("d", 4);
private int index;
private String name;
// 构造方法
private Meiju(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Meiju c : Meiju.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
方法四:可以用toString()方法覆盖
public class test {
public enum Meiju {
A("a", 1), B("b", 2), C("c", 3), D("d", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Meiju(String name, int index) {
this.name = name;
this.index = index;
}
// 覆盖方法
@Override
public String toString() {
return this.index + "_" + this.name;
}
}
public static void main(String[] args) {
System.out.println(Meiju.A.toString());
}
}
方法五:实现接口
所有的枚举类型都继承java.lang.Enum类,java不支持多继承,so~~Enum不能继承其他类
public interface Jiekou(){
public void demo();
}
public enum Meiju implements Jiekou(){
A("a", 1), B("b", 2), C("c", 3), D("d", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Meiju(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
public void demo(){
System.out.print(this.index + ":" + this.name);
}
}
方法六,接口组合枚举
public interface Demo {
enum Meiju implements Demo {
A, B, C
}
enum demo implements Demo {
DEMOA, DEMOB, DEMOC
}
}
实现方式:Demo.Meiju.A; 或者 Demo.demo.DEMOA;
方法七,枚举集合
java.util.EnumSet和java.util.EnumMap是两个枚举集合,EnumSet保证不重复,EnumMap是Map中的Key是Enum类型,value可以是任意类型,具体查看jdk文档
枚举和常量定义的区别
比如赛车
常量定义:
public class Light {
/* 车1 */
public final static int CAR1 = 1;
/* 车2 */
public final static int CAR2 = 3;
/* 车3 */
public final static int CAR3 = 2;
}
枚举类型定义
public enum Light {
// 利用构造函数传参
CAR1(1), CAR2(2), CAR3(3);
// 定义私有变量
private int index;
// 构造函数,枚举类型 只能是私有类型
private Light(int index) {
this.index = index;
}
@Override
public String toString() {
return String.valueOf(this.index);
}
}
1,你会问:有什么不好了,大家都这样用了很长时间了,没什么问题啊。但是,首先,它不是类型安全的。你必须确保是int,其次,你还要确保它的范围,最后,很多时候你打印出来的时候,只有数字,但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final常量
- 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继承了Enum),
可以添加其他方法,覆盖它本身的方法
switch()参数可以使用enum了
values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例
无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
使用EnumSet代替标志。enum要求其成员都是唯一的,但是enum中不能删除添加元素。
EnumMap的key是enum,value是任何其他Object对象。
enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。
使用enum的职责链(Chain of Responsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
使用enum的状态机
使用enum多路分发