Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有枚举的java简单开关_Java_Enums - Fatal编程技术网

带有枚举的java简单开关

带有枚举的java简单开关,java,enums,Java,Enums,我觉得我只是缺少了一些东西,或者这不是enum的用法。我知道我可以使用枚举来清理这段代码: int bookTypeId = 1; //dynamic String bookTypeName; switch (bookTypeId) { case 1: bookTypeName = "Fantasy"; break; case 2: bookTypeName = "Horror"; break

我觉得我只是缺少了一些东西,或者这不是enum的用法。我知道我可以使用枚举来清理这段代码:

    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网站上的四张海报: