枚举
1)枚举对应英文(enumeration,简写enum);
2)牧举是组常量的集合;
3)可以这样理解:校举属于一种特殊的类,里面只包含组有限的特定的对象。
枚举的二种实现方式
1)自定义类实现枚举;
2)使用enum关键字实现枚举。
自定义实现枚举
1、 不需要提供setXxx方法,因为枚举对象值通常为只读;
2、 对枚举对象/属性使用 final + static 共同修饰,实现底层优化;
3、 枚举对象名通常使用全部大写,常量的命名规范;
4、 枚举对象根据需要,也可以有多个属性。
应用案例:
// 自定义枚举的实现
class Season{
private String name; // Season name
private String description; // Season description
public String getName() {
return name;
}
public String getDescription() {
return description;
}
private Season(String name, String description){
this.name = name;
this.description = description;
}
// final和static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理;
public final static Season SPRING = new Season("spring", "warm");
public final static Season SUMMER = new Season("summer", "hot");
public final static Season AUTUMN = new Season("autumn", "cool");
public final static Season WINTER = new Season("winter", "cold");
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}
小结:
1)构造器私有化;
2)本类内部创建一组对象;
3)对外暴露对象(通过为对象添加public final static修饰符);
4)可以提供get方法,但是不要提供set。
enum关键字实现枚举
enum关键字实现枚举注意事项:
1)使用关键字 enum 替代 class;
2)2.public static final Season SPRING = new Season(“spring”, “warm”)简化成,SPRING(“spring”, “warm”) ——— 即:常量名 (实参列表);
3)如果有多个枚举对象时, 使用 “,” 号间隔,最后一个 “;” 结尾;
4)枚举对象必须放在枚举类的行首。
public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season2.SPRING);
System.out.println(Season2.AUTUMN);
}
}
// enum关键字枚举的实现
enum Season2{
// 1.使用关键字 enum 替代 class
// 2.public static final Season SPRING = new Season("spring", "warm")直接使用
// SPRING("spring", "warm") —————— 即:常量名(实参列表)
// 3.如果有多个常量(对象), 使用 “,” 号间隔即可
// 4.如果使用enum来实现枚举,要求将定义常量对象,写在前面
// 5.如果我们使用的是无参构造器,创建常量对象,则可以省略()
SPRING("spring", "warm"),
SUMMER("summer", "hot"),
AUTUMN("autumn", "cool"),
WINTER("winter", "cold"),
WHAT(); // 或者是 WHAT;
private String name; // Season name
private String description; // Season description
public String getName() {
return name;
}
public String getDescription() {
return description;
}
private Season2(){ // 无参构造器
}
private Season2(String name, String description){
this.name = name;
this.description = description;
}
// 如果使用了 enum 来实现枚举类
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}
运行结果:
Enum成员方法说明
说明: 使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类的相关方法。
enum方法一览表:
方法名 | 详细描述 |
---|---|
valueOf | 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量。 |
toString | 得到当前枚举常量的名称;你可以通过重写这个方法来使得到的结果更易读。 |
hashCode | Enum实现了hashCode0)来和equals0保持一致; 它也是不可变的。 |
getDeclaringClass | 得到枚举常量所属枚举类型的Class对象;可以用它来判断两个枚举常量是否属于同一个枚举类型。 |
name | 得到当前枚举常量的名称;建议优先使用toString0 |
ordinale | 得到当前枚举常量的次序。 |
compareTo | 枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列)。 |
clone | 枚举类型不能被Clone;为了防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupportedException 异常的不变Clone() 。 |
enum常用方法:
1)toString:返回的是当前对象名子类可以重写该方法,用于返回对象的属性信息;
2)name:返回当前对象名 (常量名) ,子类中不能重写;
3)ordinal:返回当前对象的位置号,默认从开始;
4)values:返回当前枚举类中所有的常量;
5)valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!
6)compareTo:比较两个枚举常量,比较的就是位置号!
Enum使用细节
1)使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制;
2)枚举类和普通类一样,可以实现接口,如下形式。
enum 类名 implements 接口1, 接口2{}