Java基础系列(二十):枚举入门
Enum基本介绍
关键字 enum
可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件来使用,这种新的类型就是枚举类。
比如这就是一个最简单的枚举类
public enum Size {
SMALL,MEDIUM,LARGE,EXTRA_LARGE
}
我们在实际中如何应用枚举类呢,请看下面的程序代码:
public class EnumTest {
public static void main(String[] args) {
System.out.println(Size.EXTRA_LARGE);
System.out.println(Size.SMALL);
System.out.println(Size.MEDIUM);
System.out.println(Size.LARGE);
}
}
打印结果:
EXTRA_LARGE
SMALL
MEDIUM
LARGE
我们也可以给这些枚举值赋予一个描述:
public enum Size {
SMALL("小"),MEDIUM("中"),LARGE("大"),EXTRA_LARGE("特大");
private String description;
public String getDescription() {
return description;
}
private Size(String description) {
this.description = description;
}
}
运行这个程序:
public class EnumTest {
public static void main(String[] args) {
System.out.println(Size.EXTRA_LARGE + " : " + Size.EXTRA_LARGE.getDescription());
System.out.println(Size.SMALL + " : " + Size.SMALL.getDescription());
System.out.println(Size.MEDIUM + " : " +Size.MEDIUM.getDescription());
System.out.println(Size.LARGE + " : " + Size.LARGE.getDescription());
}
}
打印结果:
EXTRA_LARGE : 特大
SMALL : 小
MEDIUM : 中
LARGE : 大
这段程序需要注意一点,枚举类中是允许我们自由的添加构造器或者我们自己定义的方法的,但是必须在enum实例序列的最后添加一个分号。同时,Java要求你必须先定义enum实例。如果在定义enum实例之前定义了任何方法或属性,那么在编译时就会得到错误信息。
Enum API介绍
所有的枚举类型都是Enum类的子类,它们继承了这个类的许多有用的方法,其中比较有用的有以下五个比较有用的方法,我们下面来一一道来:
toString
说起来方法,最离不开的就是toString,我们通过上面的例子其实就可以看出,toString方法重写后返回的其实就是枚举实例的名字:
//这是Emum类的源码,枚举的toString实现,和我们想象的完全一致
public String toString() {
return name;
}
同样返回name的还有一个方法:
public final String name() {
return name;
}
valueOf
直接看源码:
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
可以看出这个静态方法就是给某个枚举类实例设置为一个该枚举类中的一个实例值,一般用法如下:
public class EnumTest {
public static void main(String[] args) {
Size s = Enum.valueOf(Size.class,"EXTRA_LARGE");
System.out.println(s.getDescription());
}
}
打印结果:
特大
这里需要注意,第二个参数不能写成枚举类中不存在的实例,否则就会抛出一个异常。
ordinal
这个方法返回到是枚举常量在enum声明中的位置,位置从0开始计数,具体用法如下:
public class EnumTest {
public static void main(String[] args) {
System.out.println(Size.SMALL.ordinal() + " : " + Size.SMALL.getDescription());
System.out.println(Size.MEDIUM.ordinal() + " : " +Size.MEDIUM.getDescription());
System.out.println(Size.LARGE.ordinal() + " : " + Size.LARGE.getDescription());
System.out.println(Size.EXTRA_LARGE.ordinal() + " : " + Size.EXTRA_LARGE.getDescription());
}
}
打印结果:
0 : 小
1 : 中
2 : 大
3 : 特大
compareTo
//源码
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
可以看出compareTo返回的是如果调用这个方法的枚举常量在other之前,返回一个负值;如果 this==other
,则返回0;否则返回正值。枚举常量的出现次序在enum声明中指出。
values
values方法返回的是一个包含全部枚举值的数组,但是我们翻遍了源码,并没有发现这个方法,于是后来查阅了资料,通过反射机制才发现这个方法是由编译器添加的static方法。使用方法如下
public class EnumTest {
public static void main(String[] args) {
Size[] sizes = Size.values();
for (Size size : sizes) {
System.out.println(size.name() + ": " + size.getDescription());
}
}
}
打印结果:
SMALL: 小
MEDIUM: 中
LARGE: 大
EXTRA_LARGE: 特大
下节预告
这节讲解的是枚举的一些初级的应用和源码API的分析,下节我们来了解以下枚举的进阶用法。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 短视频APP开发,如何做到获取播放视频和音频文件
- 3分钟短文:Laravel模型创建数据条目的2个语法糖
- leetcode队列之最近的请求次数
- 路由策略中的IP-Prefix你了解多少?
- Qt音视频开发29-Onvif云台控制
- 十大高性能开发
- 【云+社区年度征文】java agent及字节码技术得到DNS时间流程尝试
- 短视频商城源码,制作彩色验证码
- ubuntu下的mysql安装与使用
- 排序算法
- 并发编程框架Disruptor之高性能设计
- 3分钟短文:Laravel说要用软删除,可不要真删
- leetcode队列之设计循环双端队列
- MySQL8.0的binlog详解
- Flutter NestedScrollView实现的一个经典滑动折叠头部图片的效果