在JDK1.5 之前,我们定义常量都是: public static fianl…(这种方式在现在项目中也很常见) 。jdk1.5以后有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。而且枚举类型可以帮助我们检测许多的编译失误。
枚举优点
1 增强代码可读性
2 传递参数错误
3 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高。
4 编译优势(与常量类相比)
常量类编译时,常量被直接编译进二进制代码中,常量值在升级中变化后,需要重新编译引用常量的类,因为二进制代码中存放的是旧值。枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类。
5 修改优势(与常量类相比)
枚举类编译后默认final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,易导致父类不兼容。
6 枚举型可直接与数据库交互。
7 Switch语句优势
使用int、String类型switch时,当出现参数不确定的情况,偶尔会出现越界的现象,这样我们就需要做容错操作(if条件筛选等),使用枚举,编译期间限定类型,不允许发生越界。
1.用法一:常量
建立枚举类
public enum ColorEnum {
RED,BLANK,YELLOW
}
测试
public class TestClass {
public static void main(String[] args) {
String string = ColorEnum.BLANK.toString();
System.out.println(string);
System.out.println(ColorEnum.BLANK);//注意和字符串去对比时,不能直接拿这种值对比,需要类型转换后才可以。
}
}
2.用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
public class TestClass {
public static void main(String[] args) {
ColorEnum color = ColorEnum.RED;
switch (color) {
case BLANK:
System.out.println("黑色");
break;
case RED:
System.out.println("红色");
break;
default:
break;
}
}
}
3.用法三:向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 且枚举类型的构造方法必须为私有方法。
创建枚举类
public enum MyDay{
MONDAY(1,"星期一"),THUSDAY(2,"星期二");//这个后面必须有分号
private int code;
private String name;
private MyDay(int code,String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public void setCode(int code) {
this.code = code;
}
public void setName(String name) {
this.name = name;
}
}
创建测试类
public class TestClass {
public static void main(String[] args) {
System.out.println(MyDay.MONDAY.getCode());
System.out.println(MyDay.MONDAY.getName());
System.out.println(MyDay.THUSDAY.getCode());
System.out.println(MyDay.THUSDAY.getName());
System.out.println(MyDay.THUSDAY);
}
}
4.用法四:覆盖枚举的方法
例如:覆盖toString()方法
public enum MyDay{
MONDAY(1,"星期一"),THUSDAY(2,"星期二");//这个后面必须有分号
private int code;
private String name;
private MyDay(int code,String name) {
this.code = code;
this.name = name();
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public void setCode(int code) {
this.code = code;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getName()+"---"+this.getCode();
}
}
public class TestClass {
public static void main(String[] args) {
System.out.println(MyDay.MONDAY.getCode());
System.out.println(MyDay.MONDAY.getName());
System.out.println(MyDay.THUSDAY.getCode());
System.out.println(MyDay.THUSDAY.getName());
System.out.println(MyDay.THUSDAY);
}
}
5.用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface DayInterface {
public String getDay();
}
public enum MyDay implements DayInterface{
MONDAY(1,"星期一"),THUSDAY(2,"星期二");//这个后面必须有分号
private int code;
private String name;
private MyDay(int code,String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public void setCode(int code) {
this.code = code;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getName()+"---"+this.getCode();
}
@Override
public String getDay() {
return this.getName();
}
}
public class TestClass {
public static void main(String[] args) {
System.out.println(MyDay.THUSDAY.getDay());
}
}
输出结果为:
6.用法六:使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
public class TestClass {
public static void main(String[] args) {
for (Food.Dessert dessertEnum : Food.Dessert.values()) {
System.out.print(dessertEnum + " ");
}
System.out.println();
//我这地方这么写,是因为我在自己测试的时候,把这个coffee单独到一个文件去实现那个food接口,而不是在那个接口的内部。
for (Food.Coffee coffee : Food.Coffee.values()) {
System.out.print(coffee + " ");
}
System.out.println();
//搞个实现接口,来组织枚举,简单讲,就是分类吧。如果大量使用枚举的话,这么干,在写代码的时候,就很方便调用啦。
//还有就是个“多态”的功能吧,
Food food = Food.Dessert.CAKE;
System.out.println(food);
food = Food.Coffee.BLACK_COFFEE;
System.out.println(food);
}
}