枚举和类的异同
相同点:
- 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。
- 枚举类也可以实现一个或多个接口。
不同点
- 枚举类的所有实例都必须放在第一行展示,不需使用
new
关键字,不需显式调用构造器。自动添加public static final
修饰。 - 枚举类的构造器只能是私有的。
- 使用
enum
定义、非抽象的枚举类默认使用final
修饰,不可以被继承。
可能有时候我们会想,也可以定义静态常量啊。按一般逻辑,Java会再定义一个枚举类,应该是有它的优点的。所以我们再从优缺点,来看看枚举类和常量类的异同。
枚举类的优点:
- 枚举相对于常量类来说定义更简单,其不需要定义枚举值,而常量类中的每个常量必须要手动添加值。
-
类型安全:枚举作为参数使用时可以在编译时避免弱类型错误,而常量类中的常量作为参数使用时在编译时无法避免弱类型错误。
如:若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,我们会期望传入的参数在1
至4
之间,但是开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;
- 枚举自动具备内置方法(如
values
方法可以获得所有值的集合来遍历),而常量类默认不具备这些方法。
枚举的缺点
- 枚举的缺点就是不能被继承(编译后生成的类是 final class 的),也不能通过 extends 继承其他类(枚举类编译后实质就是继承了 Enum 类,Java 是单继承机制),但是定义的枚举类可以通过 implements 实现其他接口。
- 枚举值定义完毕后除非修改重构,否则无法做扩展,而常量类可以随意继承。
看了枚举的优缺点,对于枚举的选择,简单来说,当一个类的对象是有限且固定的,或者说,我们想把常量值限定在指定范围内,如,四季,一周的七天等等,这时候,我们就可以考虑使用枚举。
例子
定义一个Season枚举类,其中第一行为四个季节的枚举值
public enum Season {
SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");
private String season;
Season(String season) {
this.season = season;
}
@Override
public String toString() {
return this.season;
}
}
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Season spring = Season.SPRING;
System.out.println(spring.name() + ": " + spring.toString());
for (Season season : Season.values()) {
System.out.println(season.name() + ": " + season.toString());
}
}
输出:
SPRING: 春天
SPRING: 春天
SUMMER: 夏天
FALL: 秋天
WINTER: 冬天
另外,Java5新增了enum关键字,同时扩展了switch,Switch() 的参数可以接受枚举。如下:
public static void judgeSeason(Season season) {
switch (season) {
case SPRING:
System.out.println("春困");
break;
case SUMMER:
System.out.println("夏乏");
break;
case FALL:
System.out.println("秋盹");
break;
case WINTER:
System.out.println("冬眠");
break;
}
}
网友评论