gpt4 book ai didi

带有枚举的java简单开关

转载 作者:行者123 更新时间:2023-11-29 03:24:37 24 4
gpt4 key购买 nike

我觉得我只是遗漏了一些东西,或者这可能不是枚举的使用。我几乎知道我可以使用枚举清理这段代码:

    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 - 如果 enumfinal这被转移到 BookType 上class 那么这种行为是不允许的;原因并不十分明显。

关于带有枚举的java简单开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21690112/

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