gpt4 book ai didi

java - 枚举在 Java 内部是如何表示的?

转载 作者:太空狗 更新时间:2023-10-29 23:02:57 30 4
gpt4 key购买 nike

Java 枚举是类。它们被编译为类。

下面的例子将如何编译?它的“类版本”是什么?确切的类代码是什么?我想要实际的 Java 代码。

public enum Ordinals {
FIRST("st"),
SECOND("nd"),
THIRD("rd");
private String notation;
private Ordinals(String notation) {
this.notation = notation;
}
public String getNotation() {
return notation;
}
}

最佳答案

每个 enum 类都被编译为 java.lang.Enum 的子类。每个枚举常量都成为该类中的 static final 常量。然后,按照声明的顺序使用所有枚举常量创建数组 $VALUES

您可以使用命令 javap -p -c Ordinals(在已编译的 .class 文件上)反汇编代码以了解详细信息。

Compiled from "Ordinals.java"
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;

public static final Ordinals SECOND;

public static final Ordinals THIRD;

private java.lang.String notation; // your custom field

private static final Ordinals[] $VALUES; // all enum constants

public static Ordinals[] values(); // every enum class has this static method
Code:
0: getstatic #1 // Field $VALUES:[LOrdinals;
3: invokevirtual #2 // Method "[LOrdinals;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[LOrdinals;"
9: areturn

public static Ordinals valueOf(java.lang.String); // every enum class has this static method
Code:
0: ldc_w #4 // class Ordinals
3: aload_0
4: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
7: checkcast #4 // class Ordinals
10: areturn

private Ordinals(java.lang.String);
Code:
0: aload_0
1: aload_1
2: iload_2
3: invokespecial #6 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
6: aload_0
7: aload_3
8: putfield #7 // Field notation:Ljava/lang/String;
11: return

public java.lang.String getNotation();
Code:
0: aload_0
1: getfield #7 // Field notation:Ljava/lang/String;
4: areturn

static {}; // fills the $VALUES array and initializes the static fields corresponding to the enum constants
Code:
0: new #4 // class Ordinals
3: dup
4: ldc #8 // String FIRST
6: iconst_0
7: ldc #9 // String st
9: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
12: putstatic #11 // Field FIRST:LOrdinals;
15: new #4 // class Ordinals
18: dup
19: ldc #12 // String SECOND
21: iconst_1
22: ldc #13 // String nd
24: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
27: putstatic #14 // Field SECOND:LOrdinals;
30: new #4 // class Ordinals
33: dup
34: ldc #15 // String THIRD
36: iconst_2
37: ldc #16 // String rd
39: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
42: putstatic #17 // Field THIRD:LOrdinals;
45: iconst_3
46: anewarray #4 // class Ordinals
49: dup
50: iconst_0
51: getstatic #11 // Field FIRST:LOrdinals;
54: aastore
55: dup
56: iconst_1
57: getstatic #14 // Field SECOND:LOrdinals;
60: aastore
61: dup
62: iconst_2
63: getstatic #17 // Field THIRD:LOrdinals;
66: aastore
67: putstatic #1 // Field $VALUES:[LOrdinals;
70: return
}

这将转换回 Java 为

public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;

public static final Ordinals SECOND;

public static final Ordinals THIRD;

private String notation;

private static final Ordinals[] $VALUES;

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

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

private Ordinals(String name, int ordinal, String notation) {
super(name, ordinal);
this.notation = notation
}

static {
FIRST = new Ordinals("FIRST", 0, "st");
SECOND = new Ordinals("SECOND", 1, "nd");
THIRD = new Ordinals("THIRD", 2, "rd");
Ordinals[] $VALUES = new Ordinals[3];
$VALUES[0] = FIRST;
$VALUES[1] = SECOND;
$VALUES[2] = THIRD;
Ordinals.$VALUES = $VALUES;
}
}

类版本与此完全无关 - 它取决于您使用的 Java 编译器的版本(或编译器上的显式设置以强制它针对旧的 Java 版本进行编译)。

关于java - 枚举在 Java 内部是如何表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354107/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com