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

如何为Java 6枚举实现values()?

佴淮晨
2023-03-14
问题内容

在Java中,您可以创建一个枚举,如下所示:

public enum Letter {
A, B, C, D, E, F, G;

static {
   for(Letter letter : values()) {
      // do something with letter
   }
}

}
这个问题涉及“ values()”方法。具体来说,如何实施?通常,我可以在Eclipse中使用F3或CTRL + Click跳到Java类的源代码(甚至对于String,Character,Integer甚至Enum之类的类)。可以查看其他枚举方法的源(例如valueOf(String))。

每次调用“ values()”都会创建一个新数组吗?如果将其分配给局部变量,然后修改其中一个元素,则会发生什么情况(显然,这不会影响values()返回的值,这意味着每次都会分配一个新数组)。

它的代码是本地的吗?还是JVM /编译器对其进行了特殊处理,仅在无法证明不会对其进行修改时才从values()返回一个新实例。


问题答案:

基本上,编译器(javac)将你的枚举转换为包含在编译时所有值的静态数组。当你调用values()时,它将为你提供此数组的.clone’d()副本。

给出这个简单的枚举:

public enum Stuff {
   COW, POTATO, MOUSE;
}

你实际上可以查看Java生成的代码:

public enum Stuff extends Enum<Stuff> {
    /*public static final*/ COW /* = new Stuff("COW", 0) */,
    /*public static final*/ POTATO /* = new Stuff("POTATO", 1) */,
    /*public static final*/ MOUSE /* = new Stuff("MOUSE", 2) */;
    /*synthetic*/ private static final Stuff[] $VALUES = new Stuff[]{Stuff.COW, Stuff.POTATO, Stuff.MOUSE};

    public static Stuff[] values() {
        return (Stuff[])$VALUES.clone();
    }

    public static Stuff valueOf(String name) {
        return (Stuff)Enum.valueOf(Stuff.class, name);
    }

    private Stuff(/*synthetic*/ String $enum$name, /*synthetic*/ int $enum$ordinal) {
        super($enum$name, $enum$ordinal);
    }
}

你可以通过创建一个临时目录并运行以下命令来查看javac如何“翻译”你的类:

javac -d <output directory> -XD-printflat filename.java


 类似资料:
  • 我试图在Enum上做一点反向工程。 接口内的枚举实现-Java

  • 问题内容: 我需要重新实现一些枚举的enum.valueof方法,以使它们不再抛出异常,而如果枚举中不存在值,则它们仅返回null。 我正在尝试基本 但是它不起作用,说我需要重写或实现一个超级类型。 我猜想我可以开设一个超级班,但是我不确定如何将它们放在一起。有任何想法吗? 问题答案: 你不能 您必须定义另一个不同的方法。valueOf方法由编译器自动生成。

  • 问题内容: 我有一个像这样的通用接口: 此接口具有有限的实例,因此最好将它们实现为枚举值。问题是那些实例具有不同类型的值,因此我尝试了以下方法,但无法编译: 有什么想法吗? 问题答案: 你不能 Java不允许在枚举常量上使用泛型类型。但是,它们允许用于枚举类型: 在这种情况下,你可以做的是为每个泛型类型都拥有一个枚举类型,或者通过将其设为一个类来“伪造”一个枚举: 不幸的是,它们都有缺点。

  • 问题内容: 我刚刚发现Java允许枚举实现接口。有什么好的用例? 问题答案: 枚举不仅仅代表被动集(例如颜色)。他们可以代表与功能更复杂的对象,所以你可能想进一步功能添加到这些是那么-例如,你可能如接口,等等。支持这些和组件。

  • 问题内容: 例如,我该怎么做: 结果示例: 问题答案: 迅捷4.2+ 从Swift 4.2(使用Xcode 10)开始,只需添加协议一致性即可从中受益。要添加此协议一致性,您只需要在某处写: 如果枚举是您自己的,则可以直接在声明中指定一致性: 然后,以下代码将打印所有可能的值: 与早期Swift版本(3.x和4.x)的兼容性 如果您需要支持Swift 3.x或4.0,则可以通过添加以下代码来模仿S

  • 我是第一次玩Scala,所以请耐心等待。还使用 tapir 来声明 API,我在为枚举提供架构时遇到问题。 我定义了一堆枚举,它们是我的域模型的一部分,并扩展了Scala的。例如,这是其中之一: 并且还有许多使用它们的案例类。例如, 使用我们之前定义的枚举,例如: 我想让这个枚举实现一个添加隐式但又不修改原始状态枚举的特征(我不想将枚举 - 以及所有其他枚举 - 耦合到这个特征)。 特征如下所示: