Java 枚举常量在引用公共静态类型对象时如何具有值

Java 枚举常量在引用公共静态类型对象时如何具有值,java,enums,constants,Java,Enums,Constants,我在网上搜索了一些信息,得到了很多关于enum是如何实现的答案。考虑这个枚举类型: public class Days{ public static final Days MONDAY = new Days(); public static final Days TUESDAY = new Days(); } 这是否等于: public enum Days1{ MONDAY,TUESDAY; } ? 如果我在我的主要方法中将这些打印为: System.out.println(Da

我在网上搜索了一些信息,得到了很多关于enum是如何实现的答案。考虑这个枚举类型:

public class Days{

public static final Days MONDAY = new Days(); 
public static final Days TUESDAY = new Days(); 

}
这是否等于:

public enum Days1{

MONDAY,TUESDAY;

}
?

如果我在我的主要方法中将这些打印为:

System.out.println(Days.MONDAY);
System.out.println(Days1.MONDAY);

,两者产生不同的结果。为什么?枚举常量是如何在创建时打印出来的,而对其他对象的引用却无法按原样打印出来的?

要严格回答您的问题,请参阅
java.lang.enum
类型的
toString()方法的源代码。您会发现它返回特定枚举常量的
name()
。手工制作的枚举常量不会覆盖
toString()
方法,因此您可以从
java.lang.Object
中看到默认实现


不过,您通常是对的——Java枚举实现了类型安全枚举模式,它基本上实现了使用常量实现的功能。请参阅有效Java中的。

严格回答您的问题:请参阅
Java.lang.Enum
类型的
toString()
方法的源代码。您会发现它返回特定枚举常量的
name()
。手工制作的枚举常量不会覆盖
toString()
方法,因此您可以从
java.lang.Object
中看到默认实现


不过,您通常是对的——Java枚举实现了类型安全枚举模式,它基本上实现了使用常量实现的功能。请参阅有效Java中的。

确实,您的类
Days
与枚举
Days1
类似。两者都实现类型安全枚举模式,为枚举值提供相同的名称


但它们并不等同(也不是原始措辞所说的“平等”)。真正的Java枚举,比如您的
Days1
,获得了许多额外的结构和支架,其中大部分来自子类化
Java.lang.Enum
,还有一些是编译器刚刚合成的。其中包括
Enum
toString()
方法,它负责
系统的.out.println(Days1.MONDAY)
输出枚举名称而不是一个神秘的字符串。

确实,您的类
Days
与枚举
Days1
类似。两者都实现类型安全枚举模式,为枚举值提供相同的名称


但它们并不等同(也不是原始措辞所说的“平等”)。真正的Java枚举,比如您的
Days1
,获得了许多额外的结构和支架,其中大部分来自子类化
Java.lang.Enum
,还有一些是编译器刚刚合成的。其中包括
Enum
toString()
方法,它负责
系统的.out.println(Days1.MONDAY)输出枚举名而不是一个神秘的字符串。

为了解释背景,Java最初没有枚举类型,因此程序员使用类开发了枚举模式,这是您的第一个示例。当Java enum最终被添加到Java 5(以及后来的语言,如Rust)中时,使用类而不是像当时大多数语言那样使用
int
s的灵活性启发了Java enum的设计,因此,作为您的第一个示例,程序员使用类开发了枚举模式。当Java Enum最终被添加到Java 5中(以及后来的语言,如Rust)时,使用类而不是
int
s的灵活性启发了Java Enum的设计。如果我在case中使用常量呢?如果常量没有值,那么switch如何区分其大小写您不能在switch语句中使用
“常量”,因为只允许使用符合JLS的类型。您可以使用
Days1
enum常量。Java有效地将enum转换为带有常量的类,并进一步添加了另一个值,例如
toString()
,能够用于
开关
的任何其他功能,这些功能被烘焙到语言中,防止您反复输入冗长的内容。如果我在这种情况下使用常量会怎么样?如果常量没有值,那么switch如何区分其大小写您不能在switch语句中使用
“常量”,因为只允许使用符合JLS的类型。您可以使用
Days1
enum常量。Java有效地将enum转换为带有常量的类,并进一步添加了另一个值,如
toString()
,能够用于
开关
的任何其他功能,这些功能被烘焙到语言中,并防止您反复输入冗长乏味的内容。