首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于Java6枚举,values()是如何实现的?

对于Java6枚举,values()是如何实现的?
EN

Stack Overflow用户
提问于 2009-07-22 04:31:58
回答 2查看 18.7K关注 0票数 73

在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()返回一个新实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-22 04:51:02

基本上,编译器(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
票数 115
EN

Stack Overflow用户

发布于 2009-07-22 04:53:46

如果将其赋值给一个局部变量,那么唯一可以修改的就是将另一个枚举赋值给这个变量。这不会更改枚举本身,因为您只更改了变量引用的对象。

看起来枚举实际上是单例的,因此在整个程序中每个枚举中只能存在一个元素,这使得==操作符对于枚举是合法的。

所以不会出现性能问题,也不会意外地更改枚举定义中的某些内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1163076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档