【问题标题】:Accessing an enum value before it's defined在定义之前访问枚举值
【发布时间】:2015-02-05 07:58:35
【问题描述】:

如果我有枚举

public enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

将值TUESDAY 保存在值MONDAY 中的最佳方法是什么(例如用于Days#nextDay 方法)。我原以为MONDAY(TUESDAY) 会起作用,但我不能这样做,因为TUESDAY 尚未定义。是否有解决方法(例如MONDAY(Days.valueOf("TUESDAY")))还是我需要编写一个单独的方法?

提前谢谢你

【问题讨论】:

标签: java enums


【解决方案1】:

最简单和首选的方法是使用 Java 8 中引入的标准类之一,例如 DayOfWeek。您可以简单地使用它的 plus(days) 方法来移动到接下来的日子,比如

DayOfWeek foo = DayOfWeek.MONDAY.plus(1);//TUESDAY
DayOfWeek bar = DayOfWeek.SUNDAY.plus(1);//MONDAY 

但如果你真正的问题是关于其他一些枚举,你可以通过几种方式解决它。


其中一种方法是让每个 Enum 实例存储其 next 实例。我们可以在静态块中设置它们的值,因为所有的枚举值都已经被声明了:

enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    static{
        MONDAY.next = TUESDAY;
        TUESDAY.next = WEDNESDAY;
        WEDNESDAY.next = THURSDAY;
        THURSDAY.next = FRIDAY;
        FRIDAY.next = SATURDAY;
        SATURDAY.next = SUNDAY;
        SUNDAY.next = MONDAY;
    }

    private Days next;

    public Days nextDay() {
        return next;
    }

}

MONDAY.nextDay() 将返回 TUESDAY


其他方法可以简单地添加方法,该方法将使用当前枚举的位置来获取下一个元素:

enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    private static final Days[] VALUES = Days.values(); // store result of values()
                                                        // to avoid creating new array
                                                        // each time we use values()
    public Days nextDay() {
        return VALUES[(ordinal() + 1) % 7];
    }

}
  • values() 按声明顺序返回当前枚举中所有值的数组
  • ordinal() 返回从 0 开始索引的当前枚举的位置(0-MONDAY、1-TUESDAY 等)。

【讨论】:

    【解决方案2】:

    我建议创建一个abstract 方法,该方法在所有常量中实现。返回值将是第二天

    public enum Days {
        MONDAY() {
            public Days nextDay() {
                return TUESDAY;
            }
        };
        //TODO: Implement the other days accordingly.
    
        abstract Days nextDay();
    }
    

    【讨论】:

    • 一个不那么冗长的替代方法是在构造函数中使用序数(而不是枚举实例)。但我更喜欢这个。
    • 我正在考虑这种方法,但我选择了abstract 方法一:)
    • ... 或名称而不是序数,如@Smutje 的回答。
    【解决方案3】:

    您还可以构建地图:

    public enum Days {
        MONDAY, TUESDAY;
    
        private static final Map<Days, Days> NEXT = new HashMap<>();
    
        static {
            NEXT.put(MONDAY, TUESDAY);
        }
    
        public static void main(String[] args) {
            final Days tuesday = Days.NEXT.get(MONDAY);
        }
    }
    

    【讨论】:

      【解决方案4】:
      public enum Days {
          MONDAY("Tuesday"), TUESDAY("Wednesday"), WEDNESDAY("Thursday"), THURSDAY(
                  "Friday"), FRIDAY("Saturday"), SATURDAY("Sunday"), SUNDAY(
                  "Monday");
      
          private String day;
      
          private Days(String day) {
              this.day = day;
          }
      
          public String getDay(){
              return day;
          }
      }
      

      我不知道您的目的,但这有效:-) 否则您可以使用其他答案。

      【讨论】:

      • 有效,但它返回 String 而不是 Days
      • 你的方法仍然可以返回一个枚举实例,使用valueOf(day)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多