参考文章:https://www.cnblogs.com/ygj0930/p/10843644.html
https://blog.csdn.net/qq_31024823/article/details/82789209
枚举的用法
- 简单的实例
注意点:
我们是先创建当前枚举对象的常量实例,再去添加我们的自定义属性和方法
RED(“红色”, 1)其实类似于public final static Color RED=new Color(“红色”,1)
public enum Color{
//首先创建当前枚举的实例对象,等同于一个个new出来的静态常量
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
//自定义成员变量
private String name;
private int index;
// 定义构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//get()和set方法
。。。。
}
- 方便的使用在switch上
//定义枚举
enum Signal {
GREEN, YELLOW, RED
}
//测试
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) { //使用枚举来作比较
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
- 如何进行抽象组织
其实,用enum关键字定义枚举类时,其实定义Enum类的子类,也就是说,我们定义的枚举类时继承自Enum类的
引申出的问题:java时不支持多继承的,如果多个枚举类有通用的行为时,如何进行抽象组织
答案:使用接口来完成,如下的代码
//定义接口
public interface Behaviour {
void print();
String getInfo();
}
//定义枚举类,实现接口
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
枚举的实现
- 概括:虽然都是定义类,但是enum关键字和class关键字的约束行为不同,class定义的类,通过new操作创建对象,想new几个就几个,而enum关键字定义的类,其实例对象,只能在这个enum类中定义好,它的实例是有限的,限制了某些东西的范围。
- Java 枚举如何比较
枚举实例可以使用 == 作比较,也可以 使用 equals() 作比较,二者结果一样,因为Enum类重写了 equals()方法,其实质还是使用 == 作比较的。
java枚举与常量类区别
优点
枚举相对于常量类来说定义更简单,其不需要定义枚举值,而常量类中的每个常量必须要手动添加值。
枚举作为参数使用时可以在编译时避免弱类型错误,而常量类中的常量作为参数使用时在编译时无法避免弱类型错误(譬如常量类型为 int,参数传递一个常量类中没定义的 int 值)。
枚举自动具备内置方法(如 values 方法可以获得所有值的集合来遍历,ordinal 方法可以获得排序值,compareTo 方法可以基于 ordinal 比较),而常量类默认不具备这些方法。
缺点
枚举的缺点就是不能被继承(编译后生成的类是 final class 的),也不能通过 extends 继承其他类(枚举类编译后实质就是继承了 Enum 类,Java 是单继承机制),但是定义的枚举类可以通过 implements 实现其他接口
枚举值定义完毕后除非修改重构,否则无法做扩展,而常量类可以随意继承。