Java 与<;关键、价值>;以干净的方式枚举

Java 与<;关键、价值>;以干净的方式枚举,java,enums,Java,Enums,我正在寻找实现和访问我的枚举的方法,但我对代码的外观不是很满意。这似乎是一种修补方法。下面是我想做的: 将此简单枚举作为我尝试执行的一个示例: public enum MyEnum { FIRST(0L), SECOND(1L), THIRD(2L); private Long number; private MyEnum(Long number){ this.number= id; } public static boolean isFirst(MyEnum

我正在寻找实现和访问我的枚举的方法,但我对代码的外观不是很满意。这似乎是一种修补方法。下面是我想做的:

将此简单枚举作为我尝试执行的一个示例:

public enum MyEnum {

  FIRST(0L), SECOND(1L), THIRD(2L);
  private Long number;

  private MyEnum(Long number){
    this.number= id;
  }

  public static boolean isFirst(MyEnum type) {
    return type == FIRST;
  }

  public static boolean isSecond(MyEnum type) {
    return type == SECOND;
  }

  public static boolean isThird(MyEnum type) {
    return type == THIRD;
  }

  public Long getId() {
    return number;
  }
}

稍后,我将一些对象设置为Long.valueOf(1L),并使用

Long.valueOf(1L).equals(instanceofmynum.getId())

我真的很讨厌在我的代码中都有那些硬编码的常量,所以我想知道使用这样的东西是否是一种不好的做法:

eMyEnum.FIRST.getId().equals(instanceOfMyEnum.getId())


这些只是一些简单的例子,但基本上是同一个问题反复出现。你觉得怎么样

为什么不在枚举中实现fromLong方法

public static MyEnum fromLong(long l) {
    switch (l) {
    {
      case 0: return FIRST;
      case 1: return SECOND;
      case 2: return THIRD;
    }
    throw new IllegalArgumentException();
}
然后将long转换为枚举并比较枚举。所以你会:

MyEnum.fromLong(longValue) == MyEnum.FIRST

为什么不在枚举中实现fromLong方法呢

public static MyEnum fromLong(long l) {
    switch (l) {
    {
      case 0: return FIRST;
      case 1: return SECOND;
      case 2: return THIRD;
    }
    throw new IllegalArgumentException();
}
然后将long转换为枚举并比较枚举。所以你会:

MyEnum.fromLong(longValue) == MyEnum.FIRST

如果您有很多枚举值,我会这样做(如果添加新值,则无需修改代码):

公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
/**
*查找映射,提供按id访问枚举的快速方法
*/
私有静态最终映射查找=新建HashMap();
/**
*静态初始值设定项,它在运行时加载枚举值并映射它们
*给他们的“数字”成员。
*/
静止的{
MyEnum[]enums=MyEnum.class.getEnumConstants();
for(MyEnum en:enums){
查找.put(en.number,en);
}
}
私有MyEnum(最终长编号){
这个数字=数字;
}
/**
*获取与参数id关联的枚举值。
*@param id标识枚举值的id
*@返回枚举值,如果找不到,则返回null。
*/
公共静态MyEnum getById(最终长id){
返回LOOKUP.get(id);
}
}

如果您有很多枚举值,我会这样做(如果添加新的枚举值,则无需修改代码):

公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
/**
*查找映射,提供按id访问枚举的快速方法
*/
私有静态最终映射查找=新建HashMap();
/**
*静态初始值设定项,它在运行时加载枚举值并映射它们
*给他们的“数字”成员。
*/
静止的{
MyEnum[]enums=MyEnum.class.getEnumConstants();
for(MyEnum en:enums){
查找.put(en.number,en);
}
}
私有MyEnum(最终长编号){
这个数字=数字;
}
/**
*获取与参数id关联的枚举值。
*@param id标识枚举值的id
*@返回枚举值,如果找不到,则返回null。
*/
公共静态MyEnum getById(最终长id){
返回LOOKUP.get(id);
}
}

显然,尽管您创建了一个enum,但您的应用程序仍然在所有地方使用这些长值,因此您可以使用如下内容:

public class TypeOfSomething {
    public static final long FIRST = 1l;
    public static final long ANALOG = 2l;
    public static final long USB = 3l;
}
然后像这样使用它们:

someLongThatIPassAsParameter = TypeOfSomething.ANALOG; 

枚举方式也很好,但我使用它的情况是,在参数中使用枚举值更方便,而枚举中的值只是附加信息(例如,用于国际化的messages.properties键)

显然,尽管您创建了一个枚举,但您仍然到处使用这些长值,因此,也许你可以使用以下方法:

public class TypeOfSomething {
    public static final long FIRST = 1l;
    public static final long ANALOG = 2l;
    public static final long USB = 3l;
}
然后像这样使用它们:

someLongThatIPassAsParameter = TypeOfSomething.ANALOG; 

enum方法也很好,但我使用它的情况是,在参数中使用enum值更方便,而enum中的值只是附加信息(例如,messages.properties用于国际化的键)

我不确定我是否正确理解了您的问题,但是使用switch进行检查这用于检查怎么样

 public enum MyEnum {

              FIRST(0L), SECOND(1L), THIRD(2L);
              private Long number;

              private static Map<Long, MyEnum> byIds = new HashMap<Long, PlaceServiceV2.MyEnum>();
              static{
                  for(MyEnum myEnum :MyEnum.values()){
                      byIds.put(myEnum.number, myEnum);
                  }

              }

              private MyEnum(Long number){
                this.number = number;   
              }

              public static MyEnum getById(Long id) {
                return byIds.get(id);
              }

              public Long getId() {
                return number;
         }
        }

public void test(){
    switch (MyEnum.getById(1L)) {
    case FIRST:

        break;
    case SECOND:

        break;

    default:
        break;
    }
}
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
私有静态映射byIds=newhashmap();
静止的{
for(MyEnum MyEnum:MyEnum.values()){
byIds.put(myEnum.number,myEnum);
}
}
私有MyEnum(长编号){
这个数字=数字;
}
公共静态MyEnum getById(长id){
返回byIds.get(id);
}
公共长getId(){
返回号码;
}
}
公开无效测试(){
开关(MyEnum.getById(1L)){
案例一:
打破
案例二:
打破
违约:
打破
}
}

我不确定我是否正确理解了您的问题,但是使用开关进行检查怎么样

 public enum MyEnum {

              FIRST(0L), SECOND(1L), THIRD(2L);
              private Long number;

              private static Map<Long, MyEnum> byIds = new HashMap<Long, PlaceServiceV2.MyEnum>();
              static{
                  for(MyEnum myEnum :MyEnum.values()){
                      byIds.put(myEnum.number, myEnum);
                  }

              }

              private MyEnum(Long number){
                this.number = number;   
              }

              public static MyEnum getById(Long id) {
                return byIds.get(id);
              }

              public Long getId() {
                return number;
         }
        }

public void test(){
    switch (MyEnum.getById(1L)) {
    case FIRST:

        break;
    case SECOND:

        break;

    default:
        break;
    }
}
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
私有静态映射byIds=newhashmap();
静止的{
for(MyEnum MyEnum:MyEnum.values()){
byIds.put(myEnum.number,myEnum);
}
}
私有MyEnum(长编号){
这个数字=数字;
}
公共静态MyEnum getById(长id){
返回byIds.get(id);
}
公共长getId(){
返回号码;
}
}
公开无效测试(){
开关(MyEnum.getById(1L)){
案例一:
打破
案例二:
打破
违约:
打破
}
}

我不明白为什么
isAnalog()
isUsb()
方法。。。为什么他们要检查第二个和第三个?或者这只是武断的。。。我希望你的程序不是这样。为什么不创建接受枚举类型并返回你想要的任何内容的方法呢?谢谢Yanick!信息技术