java - 用函数初始化Java枚举属性?
问题描述
我在 Java 8 中有一个带有 Lombok 的枚举,@Getter
并@AllArgsConstructor
用于枚举值的附加属性:
@Getter
@AllArgsConstructor
public enum MyEnum {
RED(1),
GREEN(2),
BLUE(3),
PURPLE(4);
private final int ordinal;
public String getDisplayName() {
switch (ordinal) {
case 1:
return "1st color";
case 2:
return "2nd color";
case 3:
return "3rd color";
default:
return "another color";
}
}
}
我不喜欢这个解决方案的地方:getDisplayName()
经常调用,因此每次调用都会运行 switch-case 语句。
是否可以添加另一个属性,例如displayName
由类似于的函数设置的值getDisplayName()
?
像这样的东西(伪代码):
@Getter
@AllArgsConstructor
public enum MyEnum {
RED(1, setDisplayName()),
GREEN(2, setDisplayName()),
BLUE(3, setDisplayName()),
PURPLE(4, setDisplayName());
private final int ordinal;
private String displayName;
private void setDisplayName() {
switch (ordinal) {
case 1:
displayName = "1st color";
case 2:
displayName = "2nd color";
case 3:
displayName = "3rd color";
default:
displayName = "another color";
}
}
}
解决方案
如果你没有和龙目岛结婚,我只会提供我自己的构造函数,让它完成繁重的工作
@Getter
public enum MyEnum {
RED(1),
GREEN(2),
BLUE(3),
PURPLE(4);
private final int o;
private final String display;
private MyEnum (int o) {
this.o = o;
switch (o) {
case 1:
display = "1st color";
break;
case 2:
display = "2nd color";
break;
case 3:
display = "3rd color";
break;
default:
display = "another color";
}
}
}
也根据@hfontanez 的建议更改ordinal
为。o
推荐阅读
- android - PlacePicker 在启动时立即关闭
- jenkins - 是否可以稍后在脚本部分中从声明性 Jenkinsfile 引用“代理”容器?
- react-native - React Native:无法导入csv文件
- xamarin - 如何在 Xamarin 表单的标签上使用 textcolor?
- api - Google Maps API 地图集群图像不会显示
- maven - 是否可以在 Maven 读取项目之后和生命周期开始之前运行脚本
- angular - 重定向页面时量角器执行挂起
- html - 如何区分 CSS 和 HTML 中相同的选中元素
- python - Extracting data from html using BeautifulSoup in Python
- iis - \\?\C: 是什么意思?