gpt4 book ai didi

java - 枚举是否可以为其每个常量都有一个构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:25 25 4
gpt4 key购买 nike

请看这个link . Joshua Bloch 在他的 Effective Java 一书中说

请注意,操作常量是从一个在创建常量后运行的静态 block 。

Trying to make each constant put itself into the map from its own constructor would cause a compilation error

.这是一件好事,因为它会导致 NullPointerException如果它是合法的。

Enum constructors aren’t permitted to access the enum’s static fields, except for compile-time constant fields.

这个限制是必要的因为这些静态字段在构造函数运行时还没有被初始化。

我有两个问题

  1. 枚举可以为每个常量提供单独的构造函数吗?
  2. 为什么编译时常量字段可以在构造函数中访问而不是静态字段?

谢谢

最佳答案

关于第一个问题:你不能有单独的构造函数,但你可以通过以下方式解决这个问题:

public enum EnumTest {
ONE() {
void init() {
val = 2;
}
},
TWO() {
void init() {
val = 1;
}
};

protected int val;

abstract void init();

EnumTest() {
init();
}
}

从技术上讲,这样您就可以为不同的常量使用单独的初始化方法。

另一种方法是使用初始化部分:

public enum EnumTest {
ONE() {{
val = 2;
}},
TWO() {{
val = 1;
}};

protected int val;
}

关于你的第二个问题:在构造枚举期间,常量字段是不可访问的,因为枚举常量对于静态字段是可访问的。例如,这段代码编译正确:

public enum EnumTest {
ONE, TWO;

public static final String ONE_STRING = ONE.toString();
}

如果允许从构造函数访问 ONE_STRING,您将面临无限的初始化循环或访问尚未初始化的枚举常量。

关于java - 枚举是否可以为其每个常量都有一个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069908/

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