Java中的枚举为甚么显式定义构造函数后,枚举实例一定要当方法调用?
@Getter
public enum ErrorMessage {
SUCCESS("0000");
private final String code;
ErrorMessage(String code) {
this.code = code;
}
}
我尝试各种关键字搜索,答案基本上都是在教你怎么用,并没有解决我疑问。然后我尝试使用javac编译,javap反编译也看不出啥名堂,就是搞不懂为什么,求大佬解惑
回复
1个回答
test
2024-07-03
没太理解你的问题。尝试解答一下但不知道是不是你想问的。
其实你把 Java 的 enum 看成是一种特殊的 class 语法糖就好了:
enum Color {
R, G, B
}
// 实际约等于
class Color {
public static final Color R = new Color();
public static final Color G = new Color();
public static final Color B = new Color();
private Color() {
// 隐式具有一个无参的、私有的构造函数
}
}
这是无参构造的,我们也可以指定有参构造:
enum Color {
R("FF0000"), G("00FF00"), B("0000FF");
private final String value;
private Color(String value) {
this.value = value;
}
}
// 实际约等于
class Color {
public static final Color R = new Color("FF0000");
public static final Color G = new Color("00FF00");
public static final Color B = new Color("0000FF");
private final String value;
private Color(String value) {
this.value = value;
}
}
然后你想问为啥有参的时候不能继续写成:
enum Color {
R, G, B;
private final String value;
private Color(String value) {
this.value = value;
}
}
这样?
这跟普通的 class 是一样的啊。你可以不自己声明构造函数,那么隐式会具有一个无参的构造函数:
class Foo {
}
Foo foo = new Foo();
只是说 new class 的时候必须有这么一对儿括号,而 enum 里无参时这对儿括号可以省略了而已。
但一旦你声明了有参的构造函数、且没有其他重载,那么你就不能继续这么 new 了啊,你必须传参进去才行啊:
class Foo {
private final String value;
public Foo(String value) {
this.value = value;
}
}
Foo foo = new Foo(); // ERROR!
Foo foo = new Foo("Ops"); // OK
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容