枚举
- 枚举(enum)全称为 enumeration, 是 JDK 1.5 中引入的新特性。
- 尽管枚举看起来像是一种新的数据类型,实际上,枚举就是一种受限制的类,并且具有自己的方法。创建自己的enum类时,这个类继承自 java.lang.Enum。
特点
- 枚举就是一个受限制的类, 默认继承自 java.lang.Enum.
- 枚举的第一行必须定义该枚举类型的对象.
- 枚举类型对象默认添加: public static final
- 枚举没有明确继承类.(自定义枚举继承自 java.lang.Enum, Enum 默认继承自 Object).
- 枚举类不能被继承.
- 枚举里面可以有构造方法, 成员方法, 静态方法, 抽象方法.
- 枚举可以实现接口
优势
- 增强代码可读性.
- 枚举类型可以直接与数据库交互.
- switch 语句优势.
- 编译优势: 枚举类编译时, 没有把常量编译到代码中, 即使常量发生变化, 也不会影响引用常量的类.
- 将常量组织起来, 统一管理.
- 由于 常量内存地址唯一, 使用枚举可以通过 == 来进行两个值之间的比较, 性能会有所提高.
枚举案例
枚举案例-组织枚举
含义:可以将类型相近的枚举通过接口或类组织起来(但是一般用接口方式进行组织)
原因是:
- Java接口在编译时会自动为enum类型加上public static修饰符;
- Java类在编译时会自动为 enum 类型加上static修饰符;
- 在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。
代码实例
public interface IErrorCode {
enum LoginErrorCodeEn implements INumberEnum{
OK(1,"登录成功"),ERROR_A(-1,"验证码错误"),ERROR_B(-2,"密码错误"),ERROR_C(-3,"用户已登录");
private int code;
private String description;
LoginErrorCodeEn(int code,String description){
this.code = code;
this.description = description;
}
@Override
public int getCode() {
return code;
}
@Override
public String getDescription() {
return description;
}
}
enum RigsterErrorCodeEn implements INumberEnum{
OK(1,"注册成功"),ERROR_A(-1,"账号已存在");
private int code;
private String description;
RigsterErrorCodeEn(int code,String description){
this.code = code;
this.description = description;
}
@Override
public int getCode() {
return code;
}
@Override
public String getDescription() {
return description;
}
}
}
interface INumberEnum {
int getCode();
String getDescription();
}
枚举案例–策略枚举
优点:这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。
这种做法虽然没有switch语句简洁,但是更加安全、灵活。
代码实例
public enum Salary {
JAVA(SalaryType.TEACHER),
HTML(SalaryType.TEACHER),
PYTHON(SalaryType.TEACHER),
PRINCIPAL(SalaryType.ADMINISTRATION);//校长
private final SalaryType salaryType;
Salary(SalaryType salaryType){
this.salaryType = salaryType;
}
//baseSalary-底薪 classHour-课时 teachingHourSubsidy-课时费 achievements-绩效
double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){
return salaryType.getSalary(baseSalary, classHour, teachingHourSubsidy, achievements);
}
//策略枚举
private enum SalaryType {
TEACHER {//老师
@Override
double getSalary(double baseSalary, int classHour, double teachingHourSubsidy,
double achievements) {
return baseSalary + classHour*teachingHourSubsidy + achievements;
}
},
ADMINISTRATION {//行政人员
@Override
double getSalary(double baseSalary, int classHour, double teachingHourSubsidy,
double achievements) {
return baseSalary + achievements;
}
};
abstract double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements);
}
}