枚举的几种使用案例(简单,进阶,switch,单例)
首先,应该注意:
1>.枚举类型都隐式继承了java.lang.Enum类,因此不能继承其他类,但可以实现接口;
2>.枚举类型只能有私有的构造方法(java运行时创建,外部不能进行实例化);
3>不能泛型化;
4>当有字段和方法时,枚举常量的列表必须以分号结尾;
5>编译器在创建枚举时会自动添加一些特殊方法。例如,它们具有一个静态values方法和valueOf(String)方法
例子一(反编译(反汇编).class文件判断):
写一个java类名为:enumTest.java
enum Day{
DAY,MOUTH,YEAR
}
public class enumTest {
public static void main(String[] args) {
Day day = Day.DAY;
}
}
1.javac编译:javac enumTest.java
产生两个.class 文件:Day.class enumTest.class
2.反编译Day.class ,发现原本写在enumTest.java文件中的enum类型的Day,被编译为了一个继承了Enum类的final类,里面的关键字也被编译为了static final类型的变量。还包含values()与valueOf(String)方法。
反汇编Day.class为字节码
3.反编译enumTest.class 在该类中enum Day已经不再该类中,被单独编译一个类
反汇编enumTest.class 为字节码
例子二(实际使用):
package cn.yoylee.test;
import java.util.Arrays;
/*简单使用*/
//public enum Day{
// DAY,MOUTH,YEAR;
//}
/*进阶使用1*/
//enum Day{
// DAY("天"),MOUTH("月"),YEAR("年"); //以分号结束(因为后面跟有方法)
//
// private String value;
//
// Day(String str){
// this.value = str;
// }
//
// public String getValue(){
// return value;
// }
//}
/*进阶使用2*/
enum Day{
DAY{
public String getInfo(){
return "天";
}
};
/**
* 定义抽象方法
* @return
*/
public abstract String getInfo();
}
public class enumTest {
public static void main(String[] args) {
/*简单使用测试 */
// Day day = Day.DAY;
// //测试Enum的values()方法
// System.out.println(Arrays.toString(Day.values()));
/*进阶使用测试1*/
// for (Day day : Day.values()){
// System.out.println("参数名称:"+day.name()+" 参数值:"+day.getValue());
// }
/*进阶使用2*/
System.out.println(Day.DAY.getInfo());
}
}
package cn.yoylee.test;
public enum EnumTest3 {
SYSTEM_NORMAL(200, "系统正常"),
//异常 返回码范围 400 -419 业务无关异常
INVALID_PARAM(401,"无效参数"),
//服务端异常
SERVICE_ERROR(500, "服务异常");
private int code;
private String desc;
EnumTest3(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static void main(String[] args) {
for (EnumTest3 para : EnumTest3.values()){
System.out.println("错误代码为:"+para.getCode()+" 错误信息:"+para.getDesc());
}
}
/**
* 输出:
* 错误代码为:200 错误信息:系统正常
错误代码为:401 错误信息:无效参数
错误代码为:500 错误信息:服务异常
*/
}
例子三(enum与switch):
enum Color {GREEN,RED,BLUE}
public class EnumTest2 {
public static void printName(Color color){
switch (color){
case BLUE: //无需使用Color进行引用
System.out.println("蓝色");
break;
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
}
}
public static void main(String[] args){
printName(Color.BLUE);
printName(Color.RED);
printName(Color.GREEN);
/*输出*/
//蓝色
//红色
//绿色
}
}
例子四(enum与单例模式):
1.利用enum实现的单例模式类:EnumTest4_Signal
package cn.yoylee.test;
public enum EnumTest4_Signal {
//自定义一个枚举的元素,代表EnumTest4_Signal类的实例
INSTANCE;
//单例可以有自己的操作
public void otherMethods(){
//功能处理
}
}
2.测试enum实现的单例模式的类:EnumTest4_use
package cn.yoylee.test;
/**
* 测试enum实现的单例模式
*/
public class EnumTest4_use {
public static void main(String[] args) {
//用enum实现的单利模式类:EnumTest4_Signal
EnumTest4_Signal instance = EnumTest4_Signal.INSTANCE;
EnumTest4_Signal instance1 = EnumTest4_Signal.INSTANCE;
System.out.println("instance对象的hash值为:"+instance.hashCode());
System.out.println("instance1对象的hash值为:"+instance1.hashCode());
System.out.println("是否为同一个对象:"+(instance.hashCode()==instance1.hashCode()));
//非单例模式的类:EnumTest2
EnumTest2 enumTest = new EnumTest2();
EnumTest2 enumTest1 = new EnumTest2();
System.out.println("enumTest对象的hash值为:"+enumTest.hashCode());
System.out.println("enumTest1对象的hash值为:"+enumTest1.hashCode());
System.out.println("是否为同一个对象:"+(enumTest.hashCode()==enumTest1.hashCode()));
/**
* 输出:
* instance对象的hash值为:1163157884
instance1对象的hash值为:1163157884
是否为同一个对象:true
enumTest对象的hash值为:1956725890
enumTest1对象的hash值为:356573597
是否为同一个对象:false
*/
}
}