枚举类专题
2021-05-26 本文已影响0人
攻城老狮
1 枚举类的特征
-
枚举类的值是有限的几个值。只读不需要修改
-
枚举是一组常量的集合,只包含一组有限的特定的对象
-
实现枚举有两种方式
-
自定义类实现
-
enum关键字实现
-
2 自定义类
2.1 自定义类的特征
- 不需要提供setXXX方法,因为通常枚举类为只读
- 对枚举对象使用 final+static修饰,实现底层优化
- 枚举对象名通常使用全部大写,常量的命名规范
- 枚举对象可以有多个属性
2.2 自定义类实现枚举类的步骤
- 构造器私有化
- 本类内部创建一组对象
- 对外暴露对象(public final static)
- 可以提供get方法,不要提供set方法
2.3 自定义类的使用
public class DefineEnum {
public static void main(String[] args) {
System.out.println(Role.ADMIN);
System.out.println(Role.MANAGER);
System.out.println(Role.GUEST);
}
}
class Role{
private String name;
private String desc;
public static final Role ADMIN = new Role("admin","desc admin");
public static final Role MANAGER = new Role("manager","desc manager");
public static final Role GUEST = new Role("guest","desc guest");
private Role(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Role{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
3 enum关键字实现枚举
3.1 enum关键字的特征
- 使用enum关键字开发一个枚举类,默认会继承Enum类,而且是一个final类
- 传统的 public static final Role ADMIN = new Role("admin","desc admin"); 简化为 ADMIN(“admin”,"desc admin"),必须知道调用的是哪个构造器
- 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
- 多个枚举对象时,使用逗号间隔,最后一个分号结尾
- 枚举对象必须在枚举类的行首
3.2 enum实现上述枚举
public class EnumClass {
public static void main(String[] args) {
System.out.println(Role.ADMIN);
System.out.println(Role.MANAGER);
System.out.println(Role.GUEST);
}
}
enum Role{
ADMIN("admin","desc admin"),MANAGER("manager","desc manager"),GUEST("guest","desc guest");
private String name;
private String desc;
private Role(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
3.3 enum常用方法
public class EnumClass {
public static void main(String[] args) {
//1.toString Enum类已经重写,返回当前对象名字,子类可重写
System.out.println(Role.ADMIN.toString());
//2.name 返回当前对象名,子类不能重写 final的
System.out.println(Role.ADMIN.name());
//3.ordinal 返回当前对象的位置号,默认从0开始
System.out.println(Role.GUEST.ordinal());
//4.values 返回当前枚举类所有的常量
Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
//5.valueOf 将字符串转换为枚举对象,要求字符串必须为已有常量名
Role manager = Role.valueOf("MANAGER");
System.out.println(manager);
//6.compareTo 比较两个枚举类常量,比较的是编号
System.out.println(Role.ADMIN.compareTo(Role.GUEST));
}
}
enum Role{
ADMIN("admin","desc admin"),MANAGER("manager","desc manager"),GUEST("guest","desc guest");
private String name;
private String desc;
private Role(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
- result
ADMIN
ADMIN
2
ADMIN
MANAGER
GUEST
MANAGER
-2
3.4 enum实现接口
- enum关键字使用后,不能再继承其他类,因为enum会隐式继承Enum类,而Java是单继承
- 枚举类和普通类一样可以实现接口 enum 类名 implements 接口1,接口2 { }