枚举
枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
前言
编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)
提示:以下是本篇文章正文内容,下面案例可供参考
一、枚举是什么?
枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
1.特点
- 枚举就是一个受限制的类,默认继承Enum;
- 枚举的第一行必须定义该枚举类型的对象
- 枚举类型对象默认添加: public static final 类型
- 枚举没有继承明确类(自定义枚举类默认继承Enum,Enum默认继承Object)
- 枚举类不能被继承
- 枚举里可以有构造方法、成员方法、静态方法、抽象方法
- 枚举可以实现接口
- 枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加
2.优势
- 增强代码可读性
- 枚举型可直接与数据库交互
- switch语句优势
- 编译优势(枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类 )
- 将常量组织起来,统一管理
- 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高
枚举的方法
方法名 | 解释 |
---|
Enum.valueOf(Class enumType, String name) | 根据字符串找到该枚举类中的对象 | public static void values() | 获取该枚举类对象数组 | public static void valueOf(String args0) | 根据字符串获取该枚举类中的对象 | public final String name() | 获取该枚举对象名字 | public final Class getDeclaringClass() | 获取枚举对象的枚举类型相对应的Class对象 | public final int hashCode() | 获取该枚举对象的hash值 | public final int compareTo(E o) | 两个枚举对象进行比较 | public final boolean equals(Object other) | 比较两个枚举对象是否相同 |
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
枚举类成员
二、使用步骤
枚举案例–状态机
package com.dream.enum_class04;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入信号灯:RED,YELLOW,GREEN");
String str = scan.next();
Signal signal = Signal.valueOf(str);
getTrafficInstruct(signal);
}
public static void getTrafficInstruct(Signal signal) {
switch (signal) {
case RED:
System.out.println("红灯停");
break;
case YELLOW:
System.out.println("黄灯等待");
break;
case GREEN:
System.out.println("路灯行");
break;
default:
break;
}
}
}
enum Signal {
RED, YELLOW, GREEN
}
枚举案例–组织枚举
代码如下(示例):
package com.dream.enum_class05;
public class Test01 {
public static void main(String[] args) {
System.out.println(ICode.LoginCode.OK);
System.out.println(ICode.LoginCode.ERROR_A);
System.out.println(ICode.LoginCode.ERROR_B);
System.out.println(ICode.RegisterCode.OK);
System.out.println(ICode.RegisterCode.ERROR_A);
System.out.println(ICode.RegisterCode.ERROR_B);
}
}
ICode.java代码如下(示例):
package com.dream.enum_class05;
public interface ICode {
enum LoginCode{
OK(1,"登录成功"),ERROR_A(-1,"登录失败-账号或密码错误"),ERROR_B(-2,"登录失败-验证码错误");
private int code;
private String info;
private LoginCode() {
}
private LoginCode(int code, String info) {
this.code = code;
this.info = info;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return code + " -- " + info;
}
}
enum RegisterCode{
OK(1, "注册成功"), ERROR_A(-1, "注册失败-账号或密码错误"), ERROR_B(-2, "注册失败-验证码错误");
private int code;
private String info;
private RegisterCode() {
}
private RegisterCode(int code, String info) {
this.code = code;
this.info = info;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return code + " -- " + info;
}
}
}
总结
|