java中enum的values()方法定义在哪里呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中enum的values()方法定义在哪里呢?相关的知识,希望对你有一定的参考价值。

最近在看枚举类型的时候,发现用For-each循环遍历enum中的值时,通过“enum类型名“.values()时可以获得枚举类型中的值,而我好奇去查看java6的API文档里,却发现:
1)java.lang.Enum中只有valueOf()的方法,并没有values();
2)java.lang.Object我亦并未找到values();

然后我直接去查看Enum和Object的源代码也没有发现该方法,
而在google上查,我也没有找到答案,所以在这里提问,enum的values()方法在哪里?
最后十分感谢您浪费宝贵的时间把我的提问看完,我也十分期待您的帮助。

values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例
关于详细的说明可以参考:
http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html
http://blog.sina.com.cn/s/blog_6fd0fd4b01014x8l.html
参考技术A 这个方法在java.lang.annotation 包的Enum ElementType下
ElementType(成员类型类)继承了Enum接口,增加了values方法

参考资料:http://download.oracle.com/javase/6/docs/api/java/lang/annotation/ElementType.html#values()

本回答被提问者采纳

java成神之——enum枚举操作

枚举

声明

基本使用
public enum ChineseNumber {
    YI,
    ER,
    SAN,
    SI
}

ChineseNumber.values(); // ["YI","ER","SAN","SI"]

枚举遍历

for (ChineseNumber s : ChineseNumber.values()) {
    System.out.println(s.name());
}

枚举在switch中使用

ChineseNumber s = ChineseNumber.ER;

switch(s) {
    case YI:
    System.out.println("一");
    break;
    case ER:
    System.out.println("二");
    break;
    case SAN:
    System.out.println("三");
    break;
    case SI:
    System.out.println("四");
    break;
}

枚举比较

Boolean b = ChineseNumber.YI == ChineseNumber.ER;
Boolean b = ChineseNumber.YI.equals(ChineseNumber.ER);

枚举静态构造方法

public enum ChineseNumber {
    YI(1),
    ER(2),
    SAN(3),
    SI(4);
    private int value;
    ChineseNumber(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
}

ChineseNumber.YI.getValue(); // 1

使用类来模拟枚举

class MyEnum<T extends MyEnum<T>> implements Comparable<T>, Serializable{
    public static final MyEnum ONE = new MyEnum(1);
    public static final MyEnum TWO = new MyEnum(2);
    public static final MyEnum THERE = new MyEnum(3);
    public static final MyEnum FOUR = new MyEnum(4);
    private int value;

    private MyEnum(int value){
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

MyEnum.TWO.getValue();

枚举中定义抽象方法

public enum MyAction {
        
    fn {
        public String execute() {
            return "execute this method";
        }
    };

    public abstract String execute();
};

MyAction.fn.execute();

枚举实现接口

public enum RegEx implements Predicate<String> {
    LETTERS("[a-zA-Z]+");
        
    private final Pattern pattern;
    private RegEx(final String pattern) {
        this.pattern = Pattern.compile(pattern);
    }
    @Override
    public boolean test(final String input) {
        return this.pattern.matcher(input).matches();
    }
}


RegEx.LETTERS.test("abc");

或者

public enum RegEx implements Predicate<String> {
    ISLETTERS {
        @Override
        public boolean test(final String input) {
            return Pattern.compile("[a-zA-Z]+").matcher(input).matches();
        }
    };
}

RegEx.ISLETTERS.test("abc");

单例模式

枚举是实现单例模式目前最好最优的方法

枚举被引用时才会实例化

public enum MySingletonPattern {
    Loneliness;

    private MySingletonPattern () {}

    public String SomeWords() {
        return "I am so lonely";
    }
}

MySingletonPattern.Loneliness.SomeWords();

使用静态代码快

public enum EnglishWord {
    a,b,c,d;

    private String upper;
    String getUpper() {
        return upper;
    }
    static {
        a.upper = "A";
        b.upper = "B";
        c.upper = "C";
        d.upper = "D";
    }
}
EnglishWord.a.getUpper();

EnumSet

EnumSet<EnglishWord> set = EnumSet.range(EnglishWord.a, EnglishWord.b); // 取枚举部分值from...to

EnumSet<EnglishWord> set = EnumSet.of(EnglishWord.a);

EnumMap

public enum EnglishLowerWord {
    a, b, c;
}
public enum EnglishUpperWord {
    A, B, C;
}

EnumMap<EnglishLowerWord, EnglishUpperWord> map = new EnumMap<EnglishLowerWord, EnglishUpperWord>(EnglishLowerWord.class);
map.put(EnglishLowerWord.a, EnglishUpperWord.A);
map.put(EnglishLowerWord.b, EnglishUpperWord.B);
map.put(EnglishLowerWord.c, EnglishUpperWord.C);

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

以上是关于java中enum的values()方法定义在哪里呢?的主要内容,如果未能解决你的问题,请参考以下文章

java成神之——enum枚举操作

java之枚举和注解

枚举ENUM的tostring() valueof()和values()用法

java怎么声明枚举类型

enum

java-枚举