带有枚举的java简单开关
我觉得我只是缺少了一些东西,或者这不是enum的用法。我知道我可以使用枚举来清理这段代码:带有枚举的java简单开关,java,enums,Java,Enums,我觉得我只是缺少了一些东西,或者这不是enum的用法。我知道我可以使用枚举来清理这段代码: int bookTypeId = 1; //dynamic String bookTypeName; switch (bookTypeId) { case 1: bookTypeName = "Fantasy"; break; case 2: bookTypeName = "Horror"; break
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语句的主类(这就是我开始研究enum的原因,因为现在它似乎也在做同样的事情)
是否可以在枚举内移动此开关/案例?然后以如下方式使用枚举:
bookTypeName = MYConstants.BookType.getType(bookTypeId);
还可以使用final声明此枚举(我尝试时它目前正在抱怨),还是它已经是final
谢谢 我觉得你的开关很干净。如果您想概括,我不会将硬编码业务逻辑转移到另一块硬编码业务逻辑。将其推送到配置文件或数据库。更干净的方法是一个查找表(排序)。我觉得你的开关足够干净。如果您想概括,我不会将硬编码业务逻辑转移到另一块硬编码业务逻辑。将其推送到配置文件或数据库。更干净的方法是(排序)查找表。我认为您正在寻找这种模式
public enum BookType {
INVALID(0),
HORROR(1),
FANTASY(2),
ACTION(3),
ERROR(4);
private int value;
private BookType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public String toString(){
return super.toString().toLowerCase();
}
public static BookType getInstance(int value) {
for (BookType type : BookType.values()) {
if (value == type.value) {
return type;
}
}
return INVALID;
}
public static void main(String[] args){
BookType b1 = BookType.HORROR;
System.out.println(b1.toString());
BookType b2 = BookType.getInstance(3);
System.out.println(b2.toString());
}
}
我想你正在寻找这种模式
public enum BookType {
INVALID(0),
HORROR(1),
FANTASY(2),
ACTION(3),
ERROR(4);
private int value;
private BookType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public String toString(){
return super.toString().toLowerCase();
}
public static BookType getInstance(int value) {
for (BookType type : BookType.values()) {
if (value == type.value) {
return type;
}
}
return INVALID;
}
public static void main(String[] args){
BookType b1 = BookType.HORROR;
System.out.println(b1.toString());
BookType b2 = BookType.getInstance(3);
System.out.println(b2.toString());
}
}
像下面这样的
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;
}
}
您可以删除String
属性并重写toString()
:
要回答上一个问题,
enum
不能是final
enum
是语法糖;编译器将首先创建一个类BookType extensed Enum来对其进行解压缩,如下所示
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;
}
}
您可以删除String
属性并重写toString()
:
要回答上一个问题,enum
不能是final
enum
是语法糖;编译器将首先创建一个类BookType extensed Enum对其进行解压缩。这实际上取决于id和name之间关系的重要性。我将尝试一起消除int-id。如果这是不可能的,考虑让它成为枚举中的一个领域。< /P>
public static enum BookType {
HORROR(1, "Horror"), FANTASY(2, "Fantasy"), ACTION(3, "Action"), ERROR(-1, "Error");
private String name;
private int typeCode;
BookType(int typeCode, String name) {
this.typeCode = typeCode;
this.name = name;
}
public String getName() {
return name;
}
public int getTypeCode(){
return typeCode;
}
public static BookType getFromTypeCode(int typeCode){
for(BookType bookType : BookType.values()){
if(bookType.getTypeCode() == typeCode){
return bookType;
}
}
return BookType.ERROR;
}
}
这实际上取决于id和名称之间关系的重要性。我将尝试一起消除int-id。如果这是不可能的,考虑让它成为枚举中的一个领域。< /P>
public static enum BookType {
HORROR(1, "Horror"), FANTASY(2, "Fantasy"), ACTION(3, "Action"), ERROR(-1, "Error");
private String name;
private int typeCode;
BookType(int typeCode, String name) {
this.typeCode = typeCode;
this.name = name;
}
public String getName() {
return name;
}
public int getTypeCode(){
return typeCode;
}
public static BookType getFromTypeCode(int typeCode){
for(BookType bookType : BookType.values()){
if(bookType.getTypeCode() == typeCode){
return bookType;
}
}
return BookType.ERROR;
}
}
是的,你错过了什么,就在这里。这就是你所需要的一切
enum Genre {
Unknown,
Fantasy,
Horror,
Action,
Romance;
}
您不需要将结果转换为int
,也不需要将结果转换为int
您不需要在bookTypeId
之间来回转换,请使用valueOf
如果您需要使书籍类型不仅仅是enum
,那么可以向其添加属性
您缺少的是枚举本身可以在程序的其他地方使用,它可以按名称保存到数据库中,并通过valueOf
方法恢复
让您的enum
变得简单
而不是您的开关-它似乎得到了枚举的字符串
形式
,只需执行以下操作:
String name = genre.name();
是的,你错过了什么,就在这里。这就是你所需要的一切
enum Genre {
Unknown,
Fantasy,
Horror,
Action,
Romance;
}
您不需要将结果转换为int
,也不需要将结果转换为int
您不需要在bookTypeId
之间来回转换,请使用valueOf
如果您需要使书籍类型不仅仅是enum
,那么可以向其添加属性
您缺少的是枚举本身可以在程序的其他地方使用,它可以按名称保存到数据库中,并通过valueOf
方法恢复
让您的enum
变得简单
而不是您的开关-它似乎得到了枚举的字符串
形式
,只需执行以下操作:
String name = genre.name();
你不需要在枚举中添加一个整型字段吗?啊,空对象模式和抛出异常之间的斗争开始了…你不需要在枚举中添加一个整型字段吗?啊,空对象模式和抛出异常之间的斗争开始了……您为什么将枚举放在
MYConstants
中而不是独立运行?我认为类在这种情况下会更好。@OP您在这里有几个答案;如果回答了您的问题,请接受其中一个。您为什么将枚举放在MYConstants
中而不是单独放置?我认为类
在这种情况下会更好。@OP您这里有几个答案;如果回答了您的问题,请接受其中一个。除非我大错特错,否则枚举值真的应该用大写字母书写。否则,这是一篇好文章。@ABoschman-这是旧C时代的遗物,当时很难分辨什么是常量,什么不是常量。Java不是C.Aw,我也一直在做这些错事?我的教授们需要做一些解释。好吧,如果你是对的,我是错的,至少这是一个非常有争议的问题。我能找到的大多数资料都表明它们应该是大写的,包括本页和oracle docs网站上的四张海报:除非我大错特错,否则枚举值真的应该写在所有大写中。否则,这是一篇好文章。@ABoschman-这是旧C时代的遗物,当时很难分辨什么是常量,什么不是常量。Java不是C.Aw,我也一直在做这些错事?我的教授们需要做一些解释。好吧,如果你是对的,我是错的,至少这是一个非常有争议的问题。我能找到的大多数资料都表明它们应该是CAP,包括本页和oracle docs网站上的四张海报: