枚举是一种特殊的数据,它的取值是有限的,是可以枚举出来的,比如一年有四季、一周有七天。虽然使用类也可以处理这种数据,但枚举类型更为简洁、安全和方便。
枚举的好处体现在以下几方面。
- 定义枚举的语法更为简洁。
- 枚举更为安全。一个枚举类型的变量,它的值要么为null,要么为枚举值之一,不可能为其他值,但使用整型变量,它的值就没有办法强制,值可能就是无效的。
- 枚举类型自带很多便利方法(如values、valueOf、toString等),易于使用。
基础使用:
public class Main_5_4_1 {
public static void main(String[] args) {
// 使用Size
Size size = Size.MEDIUM;
Size size = Size.SMALL;
// 枚举变量的toString方法返回其字面值,所有枚举类型也都有一个name()方法,返回值与toString()一样
System.out.println(size.toString()); // SMALL
System.out.println(size.name()); // SMALL
Size size = Size.SMALL;
// 枚举变量可以使用equals和==进行比较,结果是一样的
System.out.println(size == Size.SMALL); // true
System.out.println(size.equals(Size.SMALL));// true
System.out.println(size == Size.MEDIUM);// false
Size size = Size.MEDIUM;
// 枚举值是有顺序的,可以比较大小。枚举类型都有一个方法int or-dinal(),表示枚举值在声明时的顺序,从0开始
System.out.println(size.ordinal()); // 1
Size size = Size.SMALL;
// 枚举类型都实现了Java API中的Comparable接口,都可以通过方法compareTo与其他枚举值进行比较。比较其实就是比较ordinal的大小
System.out.println(size.compareTo(Size.MEDIUM)); // -1
// 枚举还可以用于switch语句
onChosen(Size.MEDIUM);
// 枚举类型都有一个静态的valueOf(String)方法,可以返回字符串对应的枚举值
System.out.println(Size.SMALL==Size.valueOf("SMALL")); // true
// 枚举类型也都有一个静态的values方法,返回一个包括所有枚举值的数组,顺序与声明时的顺序一致
for (Size size : Size.values()) {
System.out.println(size); // 输出为三行,分别是SMALL、MEDIUM、LARGE。
}
}
static void onChosen(Size size) {
switch (size) {
case SMALL:
System.out.println("chosen small");
break;
case MEDIUM:
System.out.println("chosen medium");
break;
case LARGE:
System.out.println("chosen large");
break;
}
}
}
典型场景:
/**
* Created by xc on 2019/11/17
* 代码清单5-13 带有实例变量和方法的枚举类Size
*/
public enum Size {
// 枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。
SMALL("S", "小号"), MEDIUM("M", "中号"), LARGE("L", "大号");
/**
* 缩写
*/
private String abbr;
/**
* 中文名称
*/
private String title;
private Size(String abbr, String title) {
this.abbr = abbr;
this.title = title;
}
public String getAbbr() {
return abbr;
}
public String getTitle() {
return title;
}
/**
* 根据缩写返回对应的枚举值。
*
* @param abbr 缩写
* @return
*/
public static Size fromAbbr(String abbr) {
for (Size size : Size.values()) {
if (size.getAbbr().equals(abbr)) {
return size;
}
}
return null;
}
}
上述代码定义了两个实例变量abbr和title,以及对应的get方法,分别表示缩写和中文名称;定义了一个私有构造方法,接受缩写和中文名称,每个枚举值在定义的时候都传递了对应的值;同时定义了一个静态方法fromAbbr,根据缩写返回对应的枚举值。需要说明的是,枚举值的定义需要放在最上面,枚举值写完之后,要以分号(;)结尾,然后才能写其他代码。这个枚举定义的使用与其他类类似,比如:
public class Main_5_4_2 {
public static void main(String[] args) {
Size s = Size.MEDIUM;
System.out.println(s.getAbbr()); //输出M
s = Size.fromAbbr("L");
System.out.println(s.getTitle()); //输出“大号”
}
}
参考:java编程逻辑5.4