枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中,此外,它还提供了安全检查功能。
泛型的出现不仅可以让程序员少写某些代码,主要的作用是解决类型安全问题,它提供编译时的安全检查, 不会因为将对象置于某个容器中而失去其类型。
11.1 枚举
枚举是一种数据类型,它是一系列具有名称的常量的集合。比如在数学中所学的合:A=123},当使用这个集合时, 只能使用集合中的1、2、3 这3个元素,不是这3个元素的值就无法使用。
Java中的枚举是同样的道理,比如在程序中定义了一个性别枚举,里面只有两个值:男、女,那么在使用该枚举时,只能使用男和女这两个值,其他的任何值都是无法使用的。
1.使用枚举类型设置常量
以往设置常量,通常将常量放置在接口中,这这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰行符为final与static。
例如,在项目中创建 Constants接口,在接口中定义常量的常规规方式。
public interface Constants {
public static final int Constants_A=1;
public static final int Constants_B=12;
}
在JDK 1.5版本中新增枚举类型后就逐渐取代了这种常量定义方式,因为通过使用枚举类型,可以赋予程序在编译时进行检查的功能。使用枚举类型定义常量的语法如下:
public enum Constants{
Constants A,
Constants B,
Constants C;
}
其中,enum 是定义枚举类型的关键字。当需要在程序中使用用该常量时,可以使用 Constants. Constants_A 来表示。
例:
package eleven01;
interface Constants { // 将常量放置在接口中
public static final int Constants_A = 1;
public static final int Constants_B = 12;
}
public class ConstantsTest {
enum Constants2 { // 将常量放置在枚举类型中
Constants_A, Constants_B
}
// 使用接口定义常量
public static void doit(int c) { // 定义一个方法,这里的参数为int型
switch (c) { // 根据常量的值做不同操作
case Constants.Constants_A:
System.out.println("doit() Constants_A");
break;
case Constants.Constants_B:
System.out.println("doit() Constants_B");
break;
}
}
public static void doit2(Constants2 c) { // 定义一个参数对象是枚举类型的方法
switch (c) { // 根据枚举类型对象做不同操作
case Constants_A:
System.out.println("doit2() Constants_A");
break;
case Constants_B:
System.out.println("doit2() Constants_B");
break;
}
}
public static void main(String[] args) {
ConstantsTest.doit(Constants.Constants_A); // 使用接口中定义的常量
ConstantsTest.doit2(Constants2.Constants_A); // 使用枚举类型中的常量
ConstantsTest.doit2(Constants2.Constants_B); // 使用枚举类型中的常量
ConstantsTest.doit(3);
// ConstantsTest.doit2(3);
}
}
结果
注
枚举类型可以在类的内部进行定义,也可以在类的外音部定义。如果在类的内部定义,则类似于内部类形式,比如例 11.1 中,当编译该类时,除了ConstantsTest.c lass 外,还存在 ConstantsTest$1.class 与 ConstantsTest$Constants2.class文件
2.深入了解枚举类型
操作枚举类型成员的方法
枚举类型较传统定义常量的方式,除了具有参数类型检测的优势之外,还具有其他方面的优势。
用户可以将一个枚举类型看作是一个类,它继承于java.langEnum类,当定义一个枚举类型时,每一个枚举类型成员都可以看作是枚举类型的一个 实例,这些枚举类型成员都默认被final、public、static 修饰,所以当使用枚举类型成员时直接使用枚举类型名称调用枚举类型成员即可。
由于枚举类型对象继承于java.langEnum 类, 所以该类中一些操作枚举类型的方法都可以应用到枚举类型中
枚举类类型的常用方法
方法名称 | 具体含义 | 使用方法 |
values() | 该方法可以将枚举类型成员以数组的形式返回 | 枚举类型名称.values() |
valueOf() | 该方法可以实现将普通字符串转换为枚举实例 | 枚举类型名称valueOf("abc") |
compareTo() | 该方法用于比较两个枚举对象在定义时的顺序 | 枚举对象.compareTo() |
ordinal() | 该方法用于得到枚举成员的位置索引 | 枚举对象.ordinal() |
1)values()
枚举类型实例包含一个values()方法,该方法可以将枚举类型成员以数组的形式返回。
例:
package eleven02;
import static java.lang.System.out;
public class ShowEnum {
enum Constants2 { // 将常量放置在枚举类型中
Constants_A, Constants_B
}
// 循环由values()方法返回的数组
public static void main(String[] args) {
for (int i = 0; i < Constants2.values().length; i++) {
// 将枚举成员变量打印
out.println("枚举类型成员变量:" + Constants2.values()[i]);
}
}
}
结果