浅谈java枚举类

简介: java枚举类

一、什么情况下使用枚举类?

  有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便?

二、为什么不用静态常量来替代枚举类呢?

publicstaticfinalint SEASON_SPRING = 1;

   publicstaticfinalint SEASON_SUMMER = 2;

   publicstaticfinalint SEASON_FALL = 3;

   publicstaticfinalint SEASON_WINTER = 4;

  枚举类更加直观,类型安全。使用常量会有以下几个缺陷:

  1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

  2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

三、枚举类入门

  先看一个简单的枚举类。

package enumcase;


publicenum SeasonEnum {

   SPRING,SUMMER,FALL,WINTER;

}

  1. enum和class、interface的地位一样
  2. 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
  3. 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
  4. 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
  5. 枚举类的构造器只能是私有的。

四、枚举类介绍

  枚举类内也可以定义属性和方法,可是是静态的和非静态的。

package enumcase;


publicenum SeasonEnum {

   SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

   

   private final String name;

   

   private SeasonEnum(String name)

   {

       this.name = name;

   }


   public String getName() {

       return name;

   }

}

   实际上在第一行写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

  构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

五、枚举类实现接口

  枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。


package enumcase;


publicenum Operation {

   PLUS{


       @Override

       publicdouble eval(double x, double y) {

           return x + y;

       }

       

   },

   MINUS{


       @Override

       publicdouble eval(double x, double y) {

           return x - y;

       }

       

   },

   TIMES{


       @Override

       publicdouble eval(double x, double y) {

           return x * y;

       }

       

   },

   DIVIDE{


       @Override

       publicdouble eval(double x, double y) {

           return x / y;

       }

       

   };

   

   /**

    * 抽象方法,由不同的枚举值提供不同的实现。

    * @param x

    * @param y

    * @return

    */

   publicabstractdouble eval(double x, double y);

   

   publicstaticvoid main(String[] args) {

       System.out.println(Operation.PLUS.eval(10, 2));

       System.out.println(Operation.MINUS.eval(10, 2));

       System.out.println(Operation.TIMES.eval(10, 2));

       System.out.println(Operation.DIVIDE.eval(10, 2));

   }

}

  Operatio类实际上是抽象的,不可以创建枚举值,所以此处在申明枚举值的时候,都实现了抽象方法,这其实是匿名内部类的实现,花括号部分是一个类体。我们可以看下编译以后的文件。

  image.png

  共生成了五个class文件,这样就证明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名内部类的实例。

六、switch语句里的表达式可以是枚举值

  Java5新增了enum关键字,同时扩展了switch。

package enumcase;


publicclass SeasonTest {

   publicvoid judge(SeasonEnum s)

   {

       switch(s)

       {

       case SPRING:

           System.out.println("春天适合踏青。");

           break;

       case SUMMER:

           System.out.println("夏天要去游泳啦。");

           break;

       case FALL:

           System.out.println("秋天一定要去旅游哦。");

           break;

       case WINTER:

           System.out.println("冬天要是下雪就好啦。");

           break;

       }

   }

   

   publicstaticvoid main(String[] args) {

       SeasonEnum s = SeasonEnum.SPRING;

       SeasonTest test = new SeasonTest();

       test.judge(s);

   }

}

  case表达式中直接写入枚举值,不需加入枚举类作为限定。

目录
相关文章
|
2天前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
17 4
|
2天前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
14 3
|
2天前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
10 2
|
2天前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
12 2
|
2天前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
4 1
|
2天前
|
Java
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
8 1
|
1天前
|
Java 机器人 程序员
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
1天前
|
Java 机器人 关系型数据库
Java中的类与接口:抽象与实现的艺术
Java中的类与接口:抽象与实现的艺术
|
1天前
|
Java
java反射-获取类的属性、构造方法、方法
java反射-获取类的属性、构造方法、方法
3 0
|
1天前
|
Java
java反射-获取类的Class对象方式
java反射-获取类的Class对象方式
3 0