枚举类学习
程序员文章站
2022-05-12 11:34:03
...
- 什么是枚举类?
类的实例个数是有限的,但又不是很多。 - JDK1.5之前如何定义枚举类?
package com.prosay.demo1;
/**
* 季节的枚举类
* 某个类的实例个数有限(说明类的构造方法不能随意被外部调用),但又不是很多。
* JDK1.5之前如何自定义枚举类
* JDK1.5之后才有Enum
* @author may
*
*/
public class Season {
//3.如何得到这个类的实例?实例个数设置为类的常量
public final static Season SPRING =new Season("春天",1);
public final static Season SUMMER =new Season("夏天",2);
public final static Season FAIL =new Season("秋天",3);
public final static Season WINTER =new Season("东天",4);
//2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
private final String name;
private final int value;
//1.私有化构造方法
private Season(String name,int value) {
this.name=name;
this.value=value;
}
//4.需要get,set方法么?不需要set,需要get
public String getName() {
return name;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return "Season [name=" + name + ", value=" + value + "]";
}
}
3.JDK1.5之后如何定义枚举类?
package com.prosay.demo1;
/**
* JDK1.5后声明枚举类
*
* @author may
*
*/
public enum SeasonEnum {
// 3.如何得到这个类的实例?实例个数设置为类的常量
SPRING("春天", 1), SUMMER("夏天", 2), FAIL("秋天", 3), WINTER("东天", 4);
// 2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
private final String name;
private final int value;
// 1.私有化构造方法
private SeasonEnum(String name, int value) {
this.name = name;
this.value = value;
}
// 4.需要get,set方法么?不需要set,需要get
public String getName() {
return name;
}
public int getValue() {
return value;
}
}
4.自定义枚举类和使用Enum声明的枚举类有什么区别?
使用Enum声明的枚举,反编译后发现是final修饰的class,所以他不可以有子类,默认继承java.lang.Enum类,所以使用Enum声明的枚举不能再继承其他类,java中不允许多继承。而用class自定义的枚举类可以继承另外一个类,还可以实现其它接口。
5.枚举类和常量类有什么区别?
package com.prosay.demo1;
/**
* 既然编译后的Enum类中使用的实质是常量,那么Enum类和常量类的区别是什么?
*
* @author may
*
*/
public class Test {
public final static String SPRING = "春天";
public final static String SUMMER = "夏天";
public final static String FAIL = "秋天";
public final static String WINTER = "东天";
public static void main(String[] args) {
Season s1 = Season.SPRING;
System.out.println(s1);
s1 = Season.SUMMER;
SeasonEnum sEnum = SeasonEnum.WINTER;
System.out.println(sEnum);
fun("东边");// 使用其他类型无法控制实参取值
// fun2("东边"); 编译的时候就能够检测到实参是否合法
fun2(SeasonEnum.SPRING);
}
public static void fun(String s) {
System.out.println(s);
}
// 使用枚举作为形式参数,可以控制调用方法时传递的实际参数的值
public static void fun2(SeasonEnum s) {
System.out.println(s);
}
}
6.枚举底层的实现原理?
可通过反编译来查看底层实现原理:
7.枚举类的常用方法有哪些?
package com.prosay.demo1;
/**
* 枚举类中有哪些常用方法?
*
* @author may
*
*/
public class TestEnumMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
DirectionEnum dEnum = DirectionEnum.valueOf("UP");
System.out.println(dEnum);
dEnum = dEnum.valueOf(DirectionEnum.class, "LEFT");
System.out.println(dEnum);
System.out.println(DirectionEnum.getInfo());
System.out.println(DirectionEnum.getEnumByDesc("向左"));
// System.out.println(DirectionEnum.getInfo());
}
}
enum DirectionEnum {
UP("向上", 1), DOWN("向下", 2), LEFT("向左", 3), RIGHT("向右", 4);
private final String desc;
private final int value;
private DirectionEnum(String desc, int value) {
this.desc = desc;
this.value = value;
}
public String toString() {
return desc + "_" + value;
}
// 如何获取枚举类中所有枚举值
public DirectionEnum[] getAllDirectionEnum() {
return DirectionEnum.values();
}
public static String getInfo() {
StringBuffer sb = new StringBuffer();
DirectionEnum[] ds = DirectionEnum.values();
for (DirectionEnum d : ds) {
sb.append(d.toString()).append("#");
}
return sb.toString();
}
public int getValue() {
return this.value;
}
public String getDesc() {
return this.desc;
}
// 通过枚举值得某个属性获取枚举对象,比如由1得到运动方向值
public static DirectionEnum getEnumByValue(int value) {
DirectionEnum[] ds = DirectionEnum.values();
for (DirectionEnum d : ds) {
if (d.getValue() == value) {
return d;
}
}
throw new IllegalArgumentException("没有这个方向,参数异常!");
}
public static DirectionEnum getEnumByDesc(String desc) {
DirectionEnum[] ds = DirectionEnum.values();
for (DirectionEnum d : ds) {
if (d.getDesc().equals(desc)) {
return d;
}
}
throw new IllegalArgumentException("没有这个方向的描述,参数异常!");
}
}
8.switch语句后面可以使用哪些数据类型?
package com.prosay.demo1;
/**
* switch语句后面可以是什么数据类型? byte,short,char,int (这些类型都可以自动转换为int类型)
* JDK1.5以后可以是enum(ordinal,该方法实际上是返回一个int类型的数组)
* JDK1.7以后是String (常量池,实际上也是转换为整数进行处理)
*
* @author may
*
*/
public class TestSwitchUseEnum {
public static void main(String[] args) {
SeasonEnum seasonEnum = SeasonEnum.SPRING;
switch (seasonEnum) {
case SPRING:
System.out.println("春天来了,你可以种个对象了!");
break;
case SUMMER:
System.out.println("夏天来了,你可以去游泳了!");
break;
case FAIL:
System.out.println("秋天来了,你可以收获对象了!");
break;
case WINTER:
System.out.println("栋天来了,你可以找个对象了!");
break;
default:
break;
}
int order = seasonEnum.ordinal();
System.out.println(order);
}
}
9.如何利用枚举一句话实现单列模式?
package com.prosay.demo1;
public enum A {
INSTANCE;
public void say() {
System.out.println("666");
}
}