如何与一组枚举值进行比较

How to compare with a set of enum values

你好,我有 enum 个月。

public enum Months{
JANUARY, FEBUARY, MARCH,
    APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}

在服务中,我有一个方法只有在月份大于 MARCH 时才有效,即 APRIL, MAY, ....。我怎样才能更雄辩地写出下面这行:

public void monthCheck(Object object){
    if (object.month!= Months.JANUARY || object.month!= Months.FEBUARY || object.month != Months.MARCH){
        //do something here
    }
}

编辑:我不能使用序数,因为我还有其他用例,例如:

如果我有待定、准备、准备、交付、完成、返回的状态枚举。我只想显示状态为 DELIEVERED、COMPLETED 或 RETURNED 的订单。 如果状态为 DELIEVERED、COMPLETED 或 RETURNED

,我只想编写这样的方法 return
if (order.getStatus()=={DELIEVERED, COMPLETED or RETURNED})
{return order} 
else{
throw new exception ("not valid status at this point");
}```

你的枚举应该有 get/set 方法,比如

public enum Months {
        JANUARY("january"), and so on;

        String months;
        Months(String months) {
            this.months = months;
        }

        public String getMonths() {
            return toggleStatus;
        }

}

现在,当您在项目的任何地方执行 Months.JANUARY.getMonths() 时,这将 return “一月”值。如果你写

JANUARY("1"), FEBRUARY("2")

然后会return1,2等等

您应该考虑使用 java.time.month(@m-deinum 已经指出)。

如果您有充分的理由重新实现 Month 并且作为面临类似要求的其他类型的规则:

您可以将属性添加到您的枚举中,因此您可以添加一个 属性“数字”。由于枚举是不可变的,因此该值必须通过构造函数设置并且以后不能更改——这非常适合您想要实现的目标。

public enum Month {
  JANUARY(1),
  FEBRUARY(2),
  MARCH(3),
  …
  DECEMBER(12);

  final public int number;

  Month(final int number) {
    this.number = number;
  }
}

然后您可以使用 属性 轻松比较您的月份。

final Month myMonth = …;
if (myMonth.number > Enum.MARCH.number) {
  …
};

根据您的风格,您可以隐藏 属性 并提供比较方法,例如。 G。 Month.comesAfter(Month);你甚至可以让 Month 实现 Comparable<Month>.


CAREFUL:您可能会想为此使用Enum.ordinal()。缺点是

  1. .ordinal() 不具有任何域语义,它仅反映您在代码中定义枚举常量的顺序。在这里使用它会为易于创建和难以发现的错误打开大门。
  2. 由于它不支持语义,开发人员在阅读您的代码中类似 month.ordinal() < otherMonth.ordinal() 的内容时可能会对此处比较的内容感到困惑,并且可能需要浏览源代码 (if 它可用)因此浪费时间,更重要的是,他们失去了对要解决的实际问题的心智模型。

提示:以单数命名枚举。类型的名称指的是单个实例,就像 class 的情况一样,例如 StringList 等等。枚举只是具有固定数量实例的专用 class。

您可以使用 switch 语句。

public void monthCheck(Month month)
{
   
   switch(month)
   {
      
      //if jan, feb, or march
      case JANUARY:
      case FEBUARY:
      case MARCH:

         //do nothing
         break;

      //else
      default:

         //do stuff here.
         //be careful - month may be null, so null check if needed.

         break;
      
   }
   
}