什么是枚举类型
如果定义一个类来完成企业员工信息,员工信息包括姓名、年龄及职位等信息(职位只有WORKER、MANAGER及BOSS三个角色),具体完成代码如下:
public class Demo {
private String name;
private Integer age;
private String role;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public static void main(String[] args) {
Demo emp1 = new Demo();
emp1.setRole("WORKER");
Demo emp2 = new Demo();
emp2.setRole("MANAGER");
Demo emp3 = new Demo();
emp3.setRole("老大");
List<Demo1> list = new ArrayList<Demo1>();
list.add(emp1);
list.add(emp2);
list.add(emp3);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getRole());
}
}
}
在上述代码中,我们可以看到在为员工设置职位角色时,可以设置不在要求中的其他角色。这样使得我们的代码安全很低(会出现意外值),还有就是代码的可读性并不是很好。我们可以将上述代码进行如下改写:
public class Demo {
private String role;
public static void main(String[] args) {
Demo emp1 = new Demo();
emp1.role = Role.WORKER;
Demo emp2 = new Demo();
emp2.role = Role.MANAGER;
Demo emp3 = new Demo();
emp3.role = "老大";
List<Demo2> list = new ArrayList<Demo2>();
list.add(emp1);
list.add(emp2);
list.add(emp3);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).role);
}
}
}
class Role {
public static final String BOSS = "BOSS";
public static final String MANAGER = "MANAGER";
public static final String WORKER = "WORKER";
}
通过这样的改写之后,代码的可读性有所提高。但是,在职位角色上依旧可以出现意外的其他值,这样的结果是我们所不希望看到的。所以,我们需要继续改写上述代码:
public class Demo {
private Role role;
public static void main(String[] args) {
Demo emp1 = new Demo();
emp1.role = Role.BOSS;
Demo emp2 = new Demo();
emp2.role = Role.MANAGER;
Demo emp3 = new Demo();
emp3.role = "老大";
List<Demo3> list = new ArrayList<Demo3>();
list.add(emp1);
list.add(emp2);
list.add(emp3);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).role);
}
}
}
class Role {
public static final Role BOSS = new Role();
public static final Role MANAGER = new Role();
public static final Role WORKER = new Role();
private Role() { }
}
当上述代码改写到此时,代码安全性和可读性的问题都已解决。但是,Java 5版本提供了一种更简单的方式来解决这个问题:
public class Demo {
private Role role;
public static void main(String[] args) {
Demo emp = new Demo();
emp.role = Role.BOSS;
}
}
enum Role {
WORKER, MANAGER, BOSS;
}
这里的“enum”关键字表示枚举类型,意思就是说在职位中具有WORKER、MANAGER及BOSS三种职位,并且只能在这三种中选择。而枚举类型中的WORKER、MANAGER及BOSS三个成员实际上都是一个Role对象。
枚举与switch
通过上面的讨论,我们可以看到枚举很适合在switch语句中使用,下面我们来看个案例代码:
public class Demo {
private Role role;
public static void main(String[] args) {
Demo emp = new Demo();
emp.role = Role.BOSS;
switch (emp.role) {
case WORKER:
System.out.println("这是员工角色.");
break;
case MANAGER:
System.out.println("这是经理角色.");
break;
case BOSS:
System.out.println("这是老板角色.");
break;
}
}
enum Role {
WORKER, MANAGER, BOSS;
}
注意的是,在switch语句中,不能使用枚举类名称,例如“case Role.WORKER”。因为编译器会根据switch语句中的emp.role来判断每个枚举类型。
枚举类型的构造器
在枚举类中具有默认的构造器,也可以自定义构造器。但是,在自定义构造器时,还是需要注意一些问题的。
使用默认构造器的代码如下:
public enum Role {
WORKER, MANAGER, BOSS;
private Role() { }
}
需要注意的是:
- 如果要定义构造器的话,在最后一个枚举项添加分隔符“;”。
- 构造器只能使用private修饰符。
使用自定义构造器的代码如下:
public enum Role {
WORKER("WORKER"), MANAGER("MANAGER"), BOSS("BOSS");
private Role(String role) {
System.out.println(role);
}
}
如果自定义构造器接收参数的话,在枚举项中需要传递对应的信息。具体做法就是在枚举项后添加“()”,直接传递即可。
枚举类型的成员
在枚举类中不仅可以包含构造器,还可以包含成员变量和成员方法。例如以下代码:
public enum Role {
WORKER, MANAGER, BOSS;
private String role;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
但是需要注意的是无论是构造器还是成员,枚举类中首先一定要定义的是枚举项,其他内容必须在枚举项后面。
枚举类中还可以包含抽象方法:
public enum Role {
WORKER {
@Override
public void show() {
System.out.println("WORKER");
}
},
MANAGER {
@Override
public void show() {
System.out.println("MANAGER");
}
},
BOSS {
@Override
public void show() {
System.out.println("MANAGER");
}
};
public abstract void show();
}
当然,如果枚举类包含抽象方法的话,枚举项必须实现该抽象方法。
枚举类型常用API
实际上,我们所使用的枚举类都是java.lang.Enum类的子类,并继承了Enum类的所有方法。常用方法如下:
- name():获取枚举项的名称。
- ordinal():获取枚举项的索引值,索引值从“0”开始。
- valueof(Class enumClass, String name):获取对应枚举类对象。
自定义的枚举类的常用方法如下:
- valueof(String name):获取对应枚举类对象。
- values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
转载说明:请注明作者及原文链接,谢谢!
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
java1.5新特性 枚举 问我文字大于20个字没问题吧?我曰:没问题,然后我凑了20个字~
深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)
JAVA5.0新特性讲解与例子 泛型 枚举等
511.509.JAVA基础教程_枚举类与注解-jdk8新特性:类型注解(511).rar
java1.5之后的新特性: 1,枚举(enum) 作用:一般用于代表一组相同类型的常用常量。 原理:语法结构与java类的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译之后实际上是...
JDK1.5新特性:自动拆装箱、泛型、增强for循环、静态方法导入、可变参数、枚举
java8详解资源合集电子档 1.Java8:Lambda序列化? 2.Java 8 lambda 最佳实践 3.Java8 lambda表达式10个示例 ...... 30.在Java 8下更好地利用枚举 31.在 Java 8 中避免 ...32.鲜为人知的Java8特性:泛化目标类型推断
本文介绍了Java 5中添加的语言特性--泛型、枚举、注释、自动装箱和增强的for循环--不需要修改JVM的指令集,几乎全部是在静态编译器和类库中实现的。对于不能使用Java 5语言特性的开发人员,有多种方法可以使他们使用...
JDK5.0的新特性一、枚举类型generic-泛型自动解包装与自动包装的功能
NULL 博文链接:https://zisefeiniao.iteye.com/blog/382689
自动装箱、拆箱 更优化的循环 可变长参数 枚举 静态引入 范型 Annotation(注解、注释)
计算机后端-Java-Java核心基础-第23章 枚举类与注解 17. jdk8新特性:类型注解.avi
计算机后端-Java-Java核心基础-第23章 枚举类与注解 16. jdk8新特性:可重复注解.avi
以上的一些程序代码均为张老师课堂即兴发挥所写,也可以看出,张老师对JAVA特性的深刻理解能力!现在说说我对这些程序代码的理解,说实话,才开始听张老师讲的时候,我感觉很模糊的,但是当我真正理解了之后,觉得...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础...第5章 高级类特性2 第6章 异常处理 第7章 Java集合 第8章 泛型 第9章 注解&枚举 第10章 IO 第11章 多线程 第12章 Java常用类 第13章 Java反射 第14章 网络编程
jdk1.5以上版本中新增加的特性描述,带有代码例子让你很清晰的明白jdk的 常量 、枚举、 for each、反射等各种新的特性,相信需要的你,一定满足。
Java8新特性终极指南 序列化和反序列化 继承、封装、多态的实现原理 容器 Java集合类总结 Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:...
在Java SE 1.5版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。太阳微系统对Java语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多...
尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 ...2020-4-22 java8 新特性 2020-4-27 单元测试