java - 我可以在构造函数中使用枚举常量的名称吗?
问题描述
假设我有一个Thing
带有名称的 s 枚举:
public enum Thing {
THINGA, THINGB, THINGC, THINGD,
THINGE("Thing E"),
;
public final String name;
private Thing(String pname) {
name = pname;
//...
}
private Thing() {
// See question
}
}
THINGE
假设我想对所有其他s做同样的事情Thing
,除了我希望默认名称与枚举常量本身的名称相同,例如:
private Thing() {
this(/* the name of the constant itself */);
}
pname
本质上,我希望for的隐含值为"THINGA"
for THINGA
、"THINGB"
for THINGB
、"THINGC"
for THINGC
、"THINGD"
forTHINGD
等。使用其中一个toString()
or name()
,编译器会大喊:
error: cannot reference this before supertype constructor has been called
有没有办法避免这种情况?
具体来说,为了用户,我包括名称。看起来"Thing E"
比看起来更自然"THINGE"
,但如果我可以编写一个方法来"THINGA"
转换"Thing A"
并在构造函数中使用它,那么我编程起来会容易得多。
解决方案
您不需要为此向构造函数提供参数,使用name()
和一些String
操作应该可以让您到达那里。
public static void main(String[] args) {
for (Thing value : Thing.values()) {
System.out.println("value.name = " + value.name);
}
}
public enum Thing {
THINGA,
THINGB,
THINGC,
THINGD,
THINGE;
public final String name;
Thing() {
this.name = name().replace("THING", "Thing ");
}
}
印刷
value.name = Thing A
value.name = Thing B
value.name = Thing C
value.name = Thing D
value.name = Thing E
推荐阅读
- c# - ASP .NET Core MVC 2.1 mvc 插件中的视图
- php - Typo3 8.7:Powermail 6.1:无法确定扩展“Powermail”和插件“Pi1”的默认控制器
- mysql - 将数据作为数组连接代码点火器传递
- angular - 路由器插座的角度正确用例
- javascript - 如何在 .on 方法中提供多个事件和处理程序?
- java - Java Streams TakeUntil 100 个元素过滤/收集
- php - Laravel 5.6 ytake/laravel-couchbase 身份验证问题
- javascript - 将 fetch api 与 ramda 一起使用
- php - 如果以用户身份登录,可以进入管理页面
- c# - 如何确定给定的路径字符串是否可以代表当前环境中的驱动器?