当前位置: 首页 > 知识库问答 >
问题:

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

蒲勇
2023-05-12
@Getter
public enum ErrorMessage {
    SUCCESS("0000");
    private final String code;
    ErrorMessage(String code) {
        this.code = code;
    }
}

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

共有3个答案

汪学真
2023-05-12

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

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

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

房冥夜
2023-05-12

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

籍兴文
2023-05-12

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

其实你把 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
 类似资料:
  • 问题内容: 我以为我很了解Java泛型,但是随后在java.lang.Enum中遇到了以下内容: 有人可以解释如何解释此类型参数吗?奖励点,用于提供可以使用类似类型参数的其他示例。 问题答案: 这意味着枚举的类型参数必须从本身具有相同类型参数的枚举派生。怎么会这样 通过使类型参数成为新类型本身。因此,如果我有一个名为StatusCode的枚举,则它等效于: 现在,如果你检查的限制,我们已经得到了-

  • 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能

  • 问题内容: 我想要一个Java枚举,其值是整数。 例如: 但是我也想要这两个常量的自定义名称, 例如“ Task Created”和“ Task Deleted”(那里有空格)。 我想尽可能优雅地做到这一点,而无需编写 太多额外的代码。 我可以在没有其他 将枚举常量映射到其自定义名称的映射的情况下实现此目标吗? 我在该项目中使用JDK 6。 问题答案: 只需为此添加一个字段: 如果您不想指定字符串

  • 在不使用其他映射( 将枚举常量映射到它们的自定义名称)的情况下,我能做到这一点吗? 我在这个项目中使用JDK6。

  • 我不确定我是否过度工程化了,但我正在考虑创建一个枚举,其中包含一个枚举列表作为它的值,从中我可以得到它的值。 我无法确定枚举的类型,以便正确地将值数组筛选到正确的枚举。例如,我可以用轻松地获得US枚举。我遇到的困难是从该数组中获得正确的值。我尝试比较名称,

  • 本文向大家介绍Java枚举类用法实例,包括了Java枚举类用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java枚举类用法。分享给大家供大家参考。具体如下: 希望本文所述对大家的java程序设计有所帮助。