枚举类与注解 之 枚举类讲解
枚举类与注解
参考网站:https://www.bilibili.com/video/BV1X741147h5?p=4
- 枚举类和注解可以看做是jdk5.0出现的两个新特性。
枚举类的使用:入门
类的对象只有有限个,确定的。
举例子:
星期:星期一,星期二,,星期日。
季节:春、夏、秋、冬。
等等
- 当需要定义一组常量的时候,强烈建议使用枚举类。
如果枚举类中只有一个对象,则可以作为单例模式的一种实现方式。
如何定义枚举类:
方式一:jdk5.0之前,自定义枚举类
方式二:jdk5.0时候,可以使用enum关键字定义枚举类。
方式一:jdk5.0之前,自定义枚举类 代码展示:
package com.enumstudy;
/**
* 枚举类的使用和测试
* 创建枚举类,使用jdk5.0之前的方式进行创建
*/
public class SessionTest {
public static void main(String[] args) {
Season autumn = Season.AUTUMN;
System.out.println(autumn);
}
}
/**
* 自定义枚举类
* 现在创建的就是枚举类
*/
class Season{
//1.申明Session对象的属性:private final 修饰
private final String seasonName;
private final String seasonDesc;
//2.私有化类的构造器,并且给对象属性赋值
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3.提供当前枚举类的多个对象
public static final Season SPRING = new Season("春天","春天是温暖的");
public static final Season SUMMER = new Season("夏天","夏天是炎热的");
public static final Season AUTUMN = new Season("秋天","秋天是凉爽的");
public static final Season WINTER = new Season("冬天","冬天是寒冷的");
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//4.其他诉求2:添加头toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
方式二:使用enum关键字创建枚举类:
package com.enumstudy;
/**
* 使用enum关键字的方式创建枚举类
* 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 autumn1 = Season1.AUTUMN;
System.out.println(autumn1);//如果我们没有重写Enum类中的toString()。输出结果:AUTUMN 说明enum的父类不是Object,因为如果是Object的话,Object中的toString()方法打印出来的是对象的地址值。
//重写了toString()的话,输出结果:Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
System.out.println("enum类的父类是:"+Season1.class.getSuperclass());//如果我们没有重写Enum类中的toString()。enum类的父类是:class java.lang.Enum
System.out.println("===============================================");
// values()主要是用来罗列枚举类的状态
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
//运行结果:
/**
* Season{seasonName='春天', seasonDesc='春天是温暖的'}
* Season{seasonName='夏天', seasonDesc='夏天是炎热的'}
* Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
* Season{seasonName='冬天', seasonDesc='冬天是寒冷的'}
*/
//类似的我们还可以查看线程的状态
System.out.println("===============================================");
Thread.State[] states = Thread.State.values();
for (int i = 0; i < states.length; i++) {
System.out.println(states[i]);
}
System.out.println("===============================================");
//valueOf(String objName) :返回枚举类中对象名称是objName的对象
Season1 summer = Season1.valueOf("SUMMER");
System.out.println(summer);
//运行结果:Season{seasonName='夏天', seasonDesc='夏天是炎热的'}
}
}
//使用enum关键字的方式定义枚举类
enum Season1{
//说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
SPRING("春天","春天是温暖的"),
SUMMER("夏天","夏天是炎热的"),
AUTUMN("秋天","秋天是凉爽的"),
WINTER("冬天","冬天是寒冷的");
//1.申明Season1对象的属性,使用private final来进行修饰
private final String seasonName;
private final String seasonDesc;
//2.私有化类的构造器,并且给对象属性赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//5.其他诉求2:添加头toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
class java.lang.Enum类中的toString():
public String toString() {
return name;
}
枚举类enum实现接口情况
情况一:实现接口,在enum类中实现抽象方法
package com.enumstudy;
/**
* 使用enum关键字的方式创建枚举类
* 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 autumn1 = Season1.AUTUMN;
autumn1.show();//运行结果:这是一个季节
Season1 autumn1 = Season1.SUMMER;
autumn1.show();//运行结果:这是一个季节
//由此我们可以看出,不论枚举类中的哪一个对象来使用,最终的运行结果都是一样的
}
}
/**
* 定义一个接口
*/
interface Info{
void show();
}
//使用enum关键字的方式定义枚举类
enum Season1 implements Info{
//说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
SPRING("春天","春天是温暖的"),
SUMMER("夏天","夏天是炎热的"),
AUTUMN("秋天","秋天是凉爽的"),
WINTER("冬天","冬天是寒冷的");
//1.申明Season1对象的属性,使用private final来进行修饰
private final String seasonName;
private final String seasonDesc;
//2.私有化类的构造器,并且给对象属性赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//5.其他诉求2:添加头toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
@Override
public void show() {
System.out.println("这是一个的季节");
}
}
情况二:枚举类实现接口,我们想要枚举类中的每个对象调用接口中的方法的时候,展示结果都不一样。
package com.enumstudy;
/**
* 使用enum关键字的方式创建枚举类
* 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 autumn1 = Season1.AUTUMN;
autumn1.show();
Season1 summer1 = Season1.SUMMER;
summer1.show();
/**
*运行结果:
秋天是一个秋高气爽的季节
夏天是一个热情似火的季节
*
*/
}
}
/**
* 定义一个接口
*/
interface Info{
void show();
}
//使用enum关键字的方式定义枚举类
enum Season1 implements Info{
//说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
SPRING("春天","春天是温暖的"){
@Override
public void show() {
System.out.println("春天是一个春暖花开的季节");
}
},
SUMMER("夏天","夏天是炎热的"){
@Override
public void show() {
System.out.println("夏天是一个热情似火的季节");
}
},
AUTUMN("秋天","秋天是凉爽的"){
@Override
public void show() {
System.out.println("秋天是一个秋高气爽的季节");
}
},
WINTER("冬天","冬天是寒冷的"){
@Override
public void show() {
System.out.println("冬天是一个冰天雪地的季节");
}
};
//1.申明Season1对象的属性,使用private final来进行修饰
private final String seasonName;
private final String seasonDesc;
//2.私有化类的构造器,并且给对象属性赋值
private Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//5.其他诉求2:添加头toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
特别注意:虽然我们说枚举类一般表示的是一组固定的值,但是我们在实际的开发中,枚举类中的值,我们也是可以修改的。
下面给大家举一个例子:
package com.enumstudy;
public enum Season2 {
SPRING("春天","春天是温暖的"),
SUMMER("夏天","夏天是炎热的"),
AUTUMN("秋天","秋天是凉爽的"),
WINTER("冬天","冬天是寒冷的");
//1.申明Season2对象的属性,使用private 来进行修饰,注意,这里我不是用final来进行修饰了,不使用final来进行修饰,我就可以给这两个属性值添加上set方法了。
private String seasonName;
private String seasonDesc;
//2.私有化类的构造器,并且给对象属性赋值
private Season2(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//添加上对应的set方法
public void setSeasonName(String seasonName) {
this.seasonName = seasonName;
}
public void setSeasonDesc(String seasonDesc) {
this.seasonDesc = seasonDesc;
}
@Override
public String toString() {
return "Season2{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
package com.enumstudy;
public class SeasonTest2 {
public static void main(String[] args) {
Season2 autumn2 = Season2.AUTUMN;
System.out.println(autumn2);
System.out.println("=========================");
autumn2.setSeasonName("蓝天");
autumn2.setSeasonDesc("蓝天是晴朗的");
System.out.println(autumn2);
}
}
运行结果:
Season2{seasonName='秋天', seasonDesc='秋天是凉爽的'}
=========================
Season2{seasonName='蓝天', seasonDesc='蓝天是晴朗的'}
我们在实际项目开发过程中会经常看到返回值是enum枚举类型的方法,是通过以下这种方式来写的,比如:
public class SeasonTest {
public static void main(String[] args) {
}
.......方法
public enum chooseSeason{
SPRING("春天","春天是温暖的"),
SUMMER("夏天","夏天是炎热的"),
AUTUMN("秋天","秋天是凉爽的"),
WINTER("冬天","冬天是寒冷的");
//添加对应的构造方法
private chooseSeason(String seasonName,String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
@Setter
@Getter
private String seasonName;
@Setter
@Getter
private String seasonDesc;
}
}