作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我觉得我只是遗漏了一些东西,或者这可能不是枚举的使用。我几乎知道我可以使用枚举清理这段代码:
int bookTypeId = 1; //dynamic
String bookTypeName;
switch (bookTypeId) {
case 1:
bookTypeName = "Fantasy";
break;
case 2:
bookTypeName = "Horror";
break;
case 3:
bookTypeName = "Action";
break;
default:
bookTypeName = "Error";
}
所以我这样做了,我将它存储在另一个类中,它看起来像:
public static enum BookType {
HORROR("Horror"), FANTASY("Fantasy"), ACTION("Action"), ERROR("Error");
private String name;
BookType(String name) {
this.name = name;
}
public String getType() {
return name;
}
}
现在像这样使用它:
switch (bookTypeId) {
case 1:
bookTypeName = MYConstants.BookType.FANTASY.getType();
break;
case 2:
bookTypeName = MYConstants.BookType.HORROR.getType();
break;
case 3:
bookTypeName = MYConstants.BookType.ACTION.getType();
break;
default:
bookTypeName = MYConstants.BookType.ERROR.getType();
}
我想更进一步,清理这个 switch 语句的主类(这就是我开始研究枚举的原因,因为现在它似乎在做同样的事情)。
是否可以将此开关/案例移动到枚举内部?然后以如下方式使用枚举
bookTypeName = MYConstants.BookType.getType(bookTypeId);
也可以使用 final 来声明这个枚举(当我尝试时它正在提示),或者它已经是 final 了吗?
谢谢!
最佳答案
像下面这样的东西?
public static enum BookType {
HORROR(1, "Horror"),
FANTASY(2, "Fantasy"),
ACTION(3, "Action");
private static final Map<Integer, BookType> LOOKUP;
static {
LOOKUP = new HashMap<>();
for (final BookType type : values()) {
LOOKUP.put(type.id, type);
}
}
public static BookType getById(final int id) {
final BookType bt = LOOKUP.get(id);
if (bt == null) {
throw new IllegalArgumentException("Invalid book id " + id);
}
return bt;
}
private final int id;
private final String name;
BookType(final int id, final String name) {
this.id = id;
this.name = name;
}
public String getType() {
return name;
}
}
用法:
final BookType type = BookType.getById(bookTypeId);
您可以删除 String
属性和覆盖 toString()
:
@Override
public String toString() {
final String name = name();
return name.substring(0, 1) + name.substring(1).toLowerCase();
}
要回答您的最后一个问题,enum
不能是 final
. enum
是语法糖;编译器将通过首先创建一个 class BookType extends Enum<BookType
来对其进行脱糖。和创造static final
新实例 class
具有指定的名称。实际enum
声明本身不是真的 class
声明所以不能是final
.此外,如果您的 enum
常量本身覆盖或实现方法(如 this example )然后每个 enum
常量将是一个匿名类扩展 Booktype
- 如果 enum
是final
这被转移到 BookType
上class 那么这种行为是不允许的;原因并不十分明显。
关于带有枚举的java简单开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21690112/
我是一名优秀的程序员,十分优秀!