首页 > 编程语言 >再谈java枚举enum

再谈java枚举enum

时间:2024-10-13 22:48:37浏览次数:6  
标签:java enum example 枚举 static StudentB org public

一、认识枚举

枚举是一种特殊类

枚举的定义:

修饰符 enum 枚举名 {
       枚举项1,枚举项2,枚举项3;
       其他成员;
}

注意:

  • 枚举的第一行只能写枚举项,多个枚举项用逗号(,),隔开
  • 每一个枚举项都是一个常量(不可改变值),且都指向一个该枚举的对象

二、为什么要使用枚举

例如,有这么一方法,需要获取男孩和女孩的一些特征。传入男孩,就返回男孩的信息,传入女孩,就返回女孩的信息。

我们来看以下几种方法实现。

方法一

我们用1表示男孩,2表示女孩,代码如下:

package org.example.enumX;

public class Example2 {
    public static void main(String[] args) {
        choseStudent(1);
    }
    public static void choseStudent(int sex){
        switch (sex){
            case 1:
                System.out.println("男孩的特征");
                break;
            case 2:
                System.out.println("女孩的特征");
                break;
            default:
                System.out.println("参数错误");
        }
    }
}
// 程序输出:男孩的特征

以上代码虽然实现了业务逻辑,但是方法传1和传2并不能让人很快理解该值的意思,甚至我们可以传3,4,5,6,7 没有任何限制。

为了让代码更容易理解, 我们吧男孩和女孩封装到一个类里面,如下,方法二

方法二

同样,用1表示男孩,2表示女孩,只是我们把信息封装到一个类里面了。

package org.example.enumX;
class StudentA{
    public static final int boy = 1;
    public static final int girl = 2;
}

public class Example1 {
    public static void main(String[] args) {
        choseStudent(StudentA.boy);
    }
    public static void choseStudent(int sex){
        switch (sex){
            case 1:
                System.out.println("男孩的特征");
                break;
            case 2:
                System.out.println("女孩的特征");
                break;
            default:
                System.out.println("参数错误");
        }
    }
}

以上代码,我们就很清楚参数传入的是一个男孩,代码可读性变好了。但是我们仍然能够传其他的int类型值。

为了限制该方法传值的问题,于是我们引入了枚举,如下方法三:

方法三

使用枚举来实现该功能

package org.example;

enum StudentB{
    BOY,GIRL
}

public class Example3 {
    public static void main(String[] args) {
        choseStudent(StudentB.BOY);
    }
    public static void choseStudent(StudentB sex){
        switch (sex){
            case BOY:
                System.out.println("男孩的特征");
                break;
            case GIRL:
                System.out.println("女孩的特征");
                break;
            default:
                System.out.println("参数错误");
        }
    }
}

这样不仅提高了代码的可读性,也限制了调用者对该方法的传值。

枚举的底层原理

我们将方法二中的类声明为final 防止继承,同事将构造方法声明为private以防止外部实例化。这样我们就可以保证,再程序内Student就只能有我们定义好的常量。如下:

package org.example.enumX;

final class StudentD{
    public static final StudentD BOY = new StudentD();
    public static final StudentD GIRL =  new StudentD();
    private StudentD(){}
}

通过上面的代码,我们也能限制调用者传递的内容。以上代码就类似为枚举的原理。

我们将方法三中的StudentB 枚举类的class文件进行反编译,可以看到如下代码:

PS D:\project\IDEAjava\testPro\demos\target\classes\org\example> javap .\StudentB.class
Compiled from "Example3.java"
final class org.example.StudentB extends java.lang.Enum<org.example.StudentB> {
  public static final org.example.StudentB BOY;
  public static final org.example.StudentB GIRL;
  public static org.example.StudentB[] values();
  public static org.example.StudentB valueOf(java.lang.String);
  static {};
}

 

标签:java,enum,example,枚举,static,StudentB,org,public
From: https://www.cnblogs.com/liyuanhong/p/18463106

相关文章

  • [java/spring/web] 深入理解:Spring @ExceptionHandler => 自定义应用异常处理器(Appli
    1概述:Spring@ExceptionHandler∈spring-web作用ExceptionHandler是Spring框架(spring-web模块)提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以......
  • Java中异常处理对程序执行流程的影响
    Java的异常处理机制为程序员提供了一种有效的手段来处理运行时可能发生的各种错误和异常情况。它通过捕获和处理异常来避免程序的崩溃,同时还能进行适当的恢复或终止操作。下面将从多个角度对异常处理对程序执行流程的影响进行分类说明,并结合详细示例来说明其影响。1.正常执行流......
  • 初学Java基础Day18---面相对象之抽象类及其抽象方法,接口的使用及其面试题
    一,抽象类及其抽象方法的使用1.抽象方法:没有代码块,使用abstract修饰的方法,交给非抽象子类去实现注意:抽象方法必须在抽象类中。2.抽象类:使用abstract修饰3.代码实现://抽象类publicabstractclassPerson{//抽象方法publicabstractvoideat();}//在......
  • Java面试题———MyBatis篇
    目录1、Mybatis中#{}和${}的区别2、当实体类中的属性名和表中的字段名不一样,怎么办3、MyBatis动态SQL了解吗4、ResultType和ResultMap有什么区别1、Mybatis中#{}和${}的区别在Mybatis中#{}和${}都可以用于在sql语句中拼接参数,但是在使用方面有很多的区别1、处理方式......
  • Java面试题———Spring篇
    目录1、谈谈你对SpringIOC的理解2、Spring中有哪些依赖注入方式3、你用过哪些Spring注解4、SpringBean的作用域有几种5、Spring中的bean线程安全吗6、谈谈你对SpringAOP的理解7、AOP的代理有几种方式8、Spring的通知类型有哪些9、了解Spring的事务管理吗10、Spring......
  • 【java面经thinking】一
    目录类加载过程加载:连接初始化GC回收机制(垃圾回收)区域判断对象是否存活回收机制HashMap类加载器加载标识加载机制缓存自定义加载器:JVM内存结构常量池string设置成final按下网址发生类加载过程分为加载,连接和初始化的过程。加载:将.class文件的二进制字节......
  • Java语言中1.方法调用栈 2.栈帧 3.局部变量表 4.操作数栈 5.动态链接 6.方法的入参存
    在Java语言中,理解方法调用栈、栈帧、局部变量表、操作数栈等概念非常重要,它们与方法的执行和内存管理密切相关。下面是对这些概念的详细解释及它们之间的关系:1.方法调用栈(MethodCallStack)方法调用栈是每个线程维护的一块内存区域,用于存储线程执行时的栈帧(每个栈帧对应一次......
  • java项目--零钱通(OOP)
    参考上一篇,项目在主方法中运行的弊端,不易修改,也不能随用随调,结合面向对象的优势,因此有了以下代码的实现:分两个部分,一个类是完成零钱通的各个功能,另一个类用于调用该类的方法。代码如下(功能类展示):/*该类是完成零钱通的各个功能的类*/publicclassOOP{booleanloop......
  • java实现--零钱通
    项目说明:参照微信小程序的零钱通,可以完成收益入账,消费,查看明细,退出系统等功能。以下是功能模块的具体代码:importjava.text.SimpleDateFormat;importjava.util.Scanner;importjava.util.Date;publicclassfirst{publicstaticvoidmain(String[]args){......
  • Java 和 Python 的终极对决:毕业设计选谁才不掉头发?
    前言:老铁们,毕业设计来了,你准备好了么?听说最近有不少同学陷入了毕业设计选择恐慌,尤其是你手边摆着两把编程界的“大宝剑”:Java和Python,不知选哪把能少掉几根头发,甚至怀疑自己还能不能顺利毕业?其实,这个问题很简单,就好像你在超市里面对两袋薯片——“哎,这袋多一点,那袋口味更好,真......