Java中的枚举为甚么显式定义构造函数后,枚举实例一定要当方法调用?

@Getter

public enum ErrorMessage {

SUCCESS("0000");

private final String code;

ErrorMessage(String code) {

this.code = code;

}

}

我尝试各种关键字搜索,答案基本上都是在教你怎么用,并没有解决我疑问。然后我尝试使用javac编译,javap反编译也看不出啥名堂,就是搞不懂为什么,求大佬解惑


回答:

没太理解你的问题。尝试解答一下但不知道是不是你想问的。

其实你把 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


回答:

这不叫当方法用。这是调用构造函数呀


回答:

你说的方法调用是指SUCCESS("0000");
你的问题是,为什么显式定义了构造函数后,就不能用SUCCESS;来定义枚举了?

SUCCESS("0000");这个不是方法,这个就是构造函数。

java里必须要有一个构造函数,当你不显式声明的时候会默认帮你加一个无参数构造函数。
当你显式声明后,就不会默认帮你加了。

以上是 Java中的枚举为甚么显式定义构造函数后,枚举实例一定要当方法调用? 的全部内容, 来源链接: utcz.com/p/945160.html

回到顶部