当前位置: 首页 > 面试题库 >

如果具有特定于常量的方法,为什么要为每种枚举类型创建不同的类文件?

宋涵忍
2023-03-14
问题内容

我有一个枚举

enum OperationsType {
  ADD("+"), SUB("-"), DIV("/"), MUL("*");

  private String opcodes;

  private OperationsType(String opcodes) {
    this.opcodes = opcodes;
  }

  public String toString() {
    return this.opcodes;
  }
}

这里所有的枚举类型没有任何constant Specific method这样javac的是只创建一个类文件enum作为

OperationsType.class

但是,如果我constant Specific method为所有枚举类型添加相同的代码,则将javac创建5个类文件。

Operations.class
Operations$1.class
Operations$2.class
Operations$3.class
Operations$4.class

对于下面的代码

enum Operations {
ADD("+") {
    public double apply(double a, double b) {
        return a + b;
    }
},
SUB("-") {
    public double apply(double a, double b) {
        return a - b;
    }
},
DIV("/") {
    public double apply(double a, double b) {
        return a / b;
    }
},
MUL("*") {
    public double apply(double a, double b) {
        return a * b;
    }
};

private String opcodes;

private Operations(String opcodes) {
    this.opcodes = opcodes;
}

public abstract double apply(double a, double b);
}

所以我怀疑为什么要compiler为每个人创建4个不同的类,而enum type如果constant Specific method没有则不创建不同的类constant Specific method呢?


问题答案:

具有特定于常量的方法的枚举是使用匿名内部类实现的。如Java语言规范中所述:

枚举常量的可选类主体隐式定义了一个匿名类声明(第15.9.5节),该声明扩展了直接封闭的枚举类型。类主体受匿名类的通常规则约束;特别是它不能包含任何构造函数。

匿名内部类是通过与像名字创建的类文件执行OuterClass$1OuterClass$2等等,这是枚举的情况下,究竟发生了什么。



 类似资料:
  • 我听到一些人建议在C++中使用枚举类,因为它们的类型安全。 但这到底意味着什么呢?

  • 枚举类(“新的枚举”/“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 传统C++枚举会被隐式转换为int,这在那些不应被转换为int的情况下可能导致错误 传统C++枚举的每一枚举值在其作用域范围内都是可见的,容易导致名称冲突(同名冲突) 不可以指定枚举的底层数据类型,这可能会导致代码不容易理解、兼容性问题以及不可以进行前向声明 枚举类(enum)(“强类型枚举”)是强类型的,并且具有类

  • 问题内容: Java枚举很棒。泛型也是如此。当然,由于类型擦除,我们都知道后者的局限性。但是有一件事我不理解,为什么我不能创建这样的枚举: 这样,该通用类型参数又可以在各个地方使用。想象一下方法的通用类型参数: 甚至在枚举类本身中: 更具体的例子#1 由于上面的示例对于某些人来说似乎太抽象了,因此下面是一个更现实的示例,说明了为什么要执行此操作。在这个例子中我想使用 枚举,因为这样我就可以枚举一组

  • 问题内容: 假设我有一个抽象类 我有一些特定的培训师,例如: 这些“训练者”中的每一个都有一套固定的技巧,他们可以训练动物去做,我想用枚举来做。所以我有一个接口: 在每个培训师中,我都有一个实现此接口的枚举。所以: 现在,在每个Trainer类中,我想要一个方法“ trainingComplete”,该方法以枚举之一作为输入并将其保存到集合中。所以 但是,我不想在每个特定的培训师中定义“完成”集,

  • 问题内容: Scala没有enumJava所具有的类型安全的。给定一组相关的常数,Scala中代表这些常数的最佳方法是什么? 问题答案: http://www.scala-lang.org/docu/files/api/scala/Enumeration.html 使用范例