1、什么状况下使用枚举类?java
有的时候一个类的对象是有限且固定的,这种状况下咱们使用枚举类就比较方便?安全
2、为何不用静态常量来替代枚举类呢?ide
public static final int SEASON_SPRING = 1; public static final int SEASON_SUMMER = 2; public static final int SEASON_FALL = 3; public static final int SEASON_WINTER = 4;
枚举类更加直观,类型安全。使用常量会有如下几个缺陷:this
1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,可是若是是枚举类型的话,就只能传入枚举类中包含的对象。设计
2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另一个开发者再看这段代码的时候,才知道这四个常量分别表明季节。对象
3、枚举类入门继承
先看一个简单的枚举类。接口
package enumcase; public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; }
4、枚举类介绍开发
枚举类内也能够定义属性和方法,但是是静态的和非静态的。get
package enumcase; public enum SeasonEnum { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; private SeasonEnum(String name) { this.name = name; } public String getName() { return name; } }
实际上在第一行写枚举类实例的时候,默认是调用了构造器的,因此此处须要传入参数,由于没有显式申明无参构造器,只能调用有参数的构造器。
构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类一般应该设计成不可变类,它的Field不该该被改变,这样会更安全,并且代码更加简洁。因此咱们将Field用private final修饰。
5、枚举类实现接口
枚举类能够实现一个或多个接口。与普通类同样,实现接口的时候须要实现接口中定义的全部方法,若没有彻底实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。
package enumcase; public enum Operation { PLUS{ @Override public double eval(double x, double y) { return x + y; } }, MINUS{ @Override public double eval(double x, double y) { return x - y; } }, TIMES{ @Override public double eval(double x, double y) { return x * y; } }, DIVIDE{ @Override public double eval(double x, double y) { return x / y; } }; /** * 抽象方法,由不一样的枚举值提供不一样的实现。 * @param x * @param y * @return */ public abstract double eval(double x, double y); public static void main(String[] args) { System.out.println(Operation.PLUS.eval(10, 2)); System.out.println(Operation.MINUS.eval(10, 2)); System.out.println(Operation.TIMES.eval(10, 2)); System.out.println(Operation.DIVIDE.eval(10, 2)); } }
Operatio类其实是抽象的,不能够建立枚举值,因此此处在申明枚举值的时候,都实现了抽象方法,这实际上是匿名内部类的实现,花括号部分是一个类体。咱们能够看下编译之后的文件。
共生成了五个class文件,这样就证实了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名内部类的实例。
6、switch语句里的表达式能够是枚举值
Java5新增了enum关键字,同时扩展了switch。
package enumcase; public class SeasonTest { public void judge(SeasonEnum s) { switch(s) { case SPRING: System.out.println("春天适合踏青。"); break; case SUMMER: System.out.println("夏天要去游泳啦。"); break; case FALL: System.out.println("秋天必定要去旅游哦。"); break; case WINTER: System.out.println("冬天要是下雪就好啦。"); break; } } public static void main(String[] args) { SeasonEnum s = SeasonEnum.SPRING; SeasonTest test = new SeasonTest(); test.judge(s); } }
case表达式中直接写入枚举值,不需加入枚举类做为限定。
作一名快乐的程序媛!欢迎你们多提提宝贵建议!