欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java枚举类接口实例原理解析

程序员文章站 2022-05-06 19:13:52
这篇文章主要介绍了java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 枚举类可以实现一个或多个接口。与普...

这篇文章主要介绍了java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

枚举类可以实现一个或多个接口。与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法。

如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑。

public interface igradehandler {
  string getgrade(string studentname);
}
public enum gradehandlerenum implements igradehandler {
  //five grade levels a b c d e
  a("90~100") {
    @override
    public string getgrade(string studentname) {
      return studentname + " outstanding";
    }
  },
  e("0~59") {
    @override
    public string getgrade(string studentname) {
      return studentname + " fail";
    }
  };
  private string score;

  gradehandlerenum(string score) {
    this.score = score;
  }

  public string getscore() {
    return this.score;
  }

  public static void main(string[] args) {
    gradehandlerenum a = gradehandlerenum.a;
    gradehandlerenum e = gradehandlerenum.valueof("e");
    system.out.println( a.getgrade("lucy"));
    system.out.println( e.getgrade("tom"));
  }
}

为了方便测试,示例只定义了a和e两个等级,执行结果如下:

lucy outstanding
tom fail

反编译枚举类

在《java枚举抽象方法实例解析》中介绍了枚举类型的简单使用,现在有必要来了解一下它的基本实现原理。实际上在使用关键字enum创建枚举类并编译后,编译器会生成一些相关的类,这些类继承了java api中的java.lang.enum类,也就是说通过关键字enum创建的枚举类在编译后事实上也是一个类类型而且该类继承自java.lang.enum类。

igradehandler.class
gradehandlerenum.class
gradehandlerenum$1.class
gradehandlerenum$2.class

使用javac编译gradehandlerenum.java文件后,生成四个class文件,其中,gradehandlerenum.class是枚举类型,这也就验证前面所说的使用关键字enum定义枚举类并编译后,编译器会自动帮助我们生成一个与枚举相关的类。使用jd-gui反编译后的主要class文件如下:

import java.io.printstream;

public enum gradehandlerenum implements igradehandler {
// 编译后生成两个class文件gradehandlerenum$1和gradehandlerenum$2
 a("90~100"), e("0~59");
 
 private string score;
 //私有构造函数
 private gradehandlerenum(string paramstring) {
  this.score = paramstring;
 }
 
 public string getscore() {
  return this.score;
 }
 
 public static void main(string[] paramarrayofstring) {
//实例化枚举实例,变量名由系统生成
  gradehandlerenum localgradehandlerenum1 = a;
  gradehandlerenum localgradehandlerenum2 = valueof("e");
  system.out.println(localgradehandlerenum1.getgrade("lucy"));
  system.out.println(localgradehandlerenum2.getgrade("tom"));
 }
}
//枚举值a对应的枚举类
enum gradehandlerenum$1{
 gradehandlerenum$1(string paramstring1) {
  super(paramstring, paramint, paramstring1, null);
 }
 
 public string getgrade(string paramstring) {
  return paramstring + " outstanding";
 }
}
//枚举值b对应的枚举类
enum gradehandlerenum$2{
 gradehandlerenum$2(string paramstring1) {
  super(paramstring, paramint, paramstring1, null);
 }
 
 public string getgrade(string paramstring) {
  return paramstring + " fail";
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。