Java基础之枚举类与注解-枚举类
思考:
- 如何自定义枚举类
- 如何使用关键字enum定义枚举类
- Enum类的主要方法
- 实现接口的枚举类
什么是枚举类?
- 类的对象只有有限个并且是确定的
- 当需要定义一组常量时,强烈建议使用枚举类
如何定义枚举类?
- 在jdk5.0之前,自定义枚举类
- jdk5.0及以后,使用enum关键字定义枚举类
-
自定义枚举类
a. 声明MyEnum对象的属性:将属性声明成private final修饰
//1.声明MyEnum对象的属性:将属性声明成private final修饰
private final String name;
private final String desc;
b.私有化构造方法,并且给private final的属性赋值
private MyEnum(String name,String desc){
this.name = name;
this.desc = desc;
}
c. 提供当前枚举类的多个对象
public static final MyEnum TYPE1 = new MyEnum("myEnum1","desc1");
public static final MyEnum TYPE2 = new MyEnum("myEnum2","desc2");
public static final MyEnum TYPE3 = new MyEnum("myEnum3","desc3");
public static final MyEnum TYPE4 = new MyEnum("myEnum4","desc3");
/**
* 一、枚举类的使用
* 1.枚举类的理解:类的对象只有有限个并且是确定的,则可以使用枚举类
* 2.当需要定义一组常量时,强烈建议使用枚举类
* 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
*
* 二、如何定义枚举类
* 1.在JDK5.0之前,自定义枚举类
* 2.在JDK5.0及以后,使用enum关键字定义枚举类
*
* @author jiangl
* @version 1.0
* @date 2021/4/21 8:44
*/
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyEnum.TYPE1.getName());
}
}
//自定义枚举类
class MyEnum{
//1.声明MyEnum对象的属性:将属性声明成private final修饰
private final String name;
private final String desc;
/**
* 2.私有化构造方法,并且给private final的属性赋值
*/
private MyEnum(String name,String desc){
this.name = name;
this.desc = desc;
}
/**
* 3.提供当前枚举类的多个对象
*/
public static final MyEnum TYPE1 = new MyEnum("myEnum1","desc1");
public static final MyEnum TYPE2 = new MyEnum("myEnum2","desc2");
public static final MyEnum TYPE3 = new MyEnum("myEnum3","desc3");
public static final MyEnum TYPE4 = new MyEnum("myEnum4","desc3");
/**
* 4.其他需求,获取枚举类对象的属性
* @return
*/
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
- 使用enum关键字定义枚举类(默认继承于java.lang.Enum)
-
提供当前枚举类的对象
- 多个对象之间用“,"隔开
- 末尾对象用";"结束
/** * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束 */ TYPE1("myEnum1","desc1"), TYPE2("myEnum2","desc2"), TYPE3("myEnum3","desc3"), TYPE4("myEnum4","desc3");
-
enum MyEnum枚举类的父类为java.lang.Enum
/**
* 在JDK5.0及以后,使用enum关键字定义枚举类
* @author jiangl
* @version 1.0
* @date 2021/4/21 8:44
*/
public class EnumTest1 {
public static void main(String[] args) {
System.out.println(MyEnum1.TYPE1.getName());
System.out.println(MyEnum1.class.getSuperclass());
}
}
//使用enum关键字枚举类
enum MyEnum1{
/**
* 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
*/
TYPE1("myEnum1","desc1"),
TYPE2("myEnum2","desc2"),
TYPE3("myEnum3","desc3"),
TYPE4("myEnum4","desc3");
//2.声明MyEnum对象的属性:将属性声明成private final修饰
private final String name;
private final String desc;
/**
* 3.私有化构造方法,并且给private final的属性赋值
*/
private MyEnum1(String name,String desc){
this.name = name;
this.desc = desc;
}
/**
* 4.其他诉求,获取枚举类对象的属性
* @return
*/
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
- Enum类中的常用方法:
- 父类中提供的方法
方法名 | 详细描述 |
---|---|
valueof | 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量 |
toString | 得到当前枚举常量的名称。可以通过重写这方法来使得得到的结果更易懂 |
equals | 在枚举类型中可以直接使用"“来比较两个枚举常量是否相等。Enum提供的这个equals()方法,也是直接使用”"实现的。它的存在是为了在Set、List和Map中使用。注意,equals()是不可变的(被final修饰),即枚举类不能重写equals方法。 |
hashCode | Enum实现了hashCode()来和equals()保持一致。hashCode()方法也是不可变的(被final修饰),即枚举类不能重写hashCode()方法 |
getDeclaringClass | 得到枚举常量所属枚举类型的Class对象。可以用此方法判断两个枚举常量是否属于同一个枚举类型 |
name | 得到当前枚举常量的名称。建议优先使用toString()方法 |
ordinal | 得到当前枚举常量的次序 |
compareTo | 枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列) |
clone | 枚举类型不能被Clone。为了防止子类实现克隆方法,Enum实现了一个仅抛出了CloneNotSupportedException异常的不变clone()方法,即枚举类不能重写clone()方法 |
- 主要方法:
- values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,可用于自定义根据key获取响应枚举值
- valueOf(String str): 根据一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”(枚举类对象常量名)。如不是,会有运行时异常:IllegalArgumentException
- toString(): 返回当前枚举类对象常量的名称
/**
* 在JDK5.0及以后,使用enum关键字定义枚举类
* @author jiangl
* @version 1.0
* @date 2021/4/21 8:44
*/
public class EnumTest1 {
public static void main(String[] args) {
//toString(): 返回当前枚举类对象常量的名称
System.out.println(MyEnum1.TYPE1.toString());
//等同于MyEnum1.TYPE1 valueOf(String str): 根据一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”(枚举类对象常量名)。如不是,会有运行时异常:IllegalArgumentException
System.out.println(MyEnum1.valueOf("TYPE1"));
//values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,可用于自定义根据key获取响应枚举值
MyEnum1[] values = MyEnum1.values();
for(int i=0;i<=values.length-1;i++){
System.out.println(values[i]);
}
}
}
//使用enum关键字枚举类
enum MyEnum1{
/**
* 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束
*/
TYPE1("myEnum1","desc1"),
TYPE2("myEnum2","desc2"),
TYPE3("myEnum3","desc3"),
TYPE4("myEnum4","desc3");
//2.声明MyEnum对象的属性:将属性声明成private final修饰
private final String name;
private final String desc;
/**
* 3.私有化构造方法,并且给private final的属性赋值
*/
private MyEnum1(String name,String desc){
this.name = name;
this.desc = desc;
}
/**
* 4.其他诉求,获取枚举类对象的属性
* @return
*/
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "MyEnum1{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
-
使用自定义枚举类和enum枚举类实现接口
-
实现接口,在enum类中实现抽象方法
interface MyInfo{ void read(); } //使用enum关键字枚举类 enum MyEnum1 implements MyInfo{ /** * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束 */ TYPE1("myEnum1","desc1"), TYPE2("myEnum2","desc2"), TYPE3("myEnum3","desc3"), TYPE4("myEnum4","desc3"); .... @Override public void read() { System.out.println("重写了read"); } }
-
针对每个枚举类对象分别实现抽象方法
interface MyInfo{ void read(); } //使用enum关键字枚举类 enum MyEnum1 implements MyInfo{ /** * 1.提供当前枚举类的对象,多个对象之间用“,"隔开,末尾对象用";"结束 */ TYPE1("myEnum1","desc1"){ @Override public void read() { System.out.println("myEnum1-read"); } }, TYPE2("myEnum2","desc2"){ @Override public void read() { System.out.println("myEnum2-read"); } }, TYPE3("myEnum3","desc3"){ @Override public void read() { System.out.println("myEnum3-read"); } }, TYPE4("myEnum4","desc3"){ @Override public void read() { System.out.println("myEnum4-read"); } }; //2.声明MyEnum对象的属性:将属性声明成private final修饰 private final String name; private final String desc; /** * 3.私有化构造方法,并且给private final的属性赋值 */ private MyEnum1(String name,String desc){ this.name = name; this.desc = desc; } /** * 4.其他诉求,获取枚举类对象的属性 * @return */ public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return "MyEnum1{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
-