如何与一组枚举值进行比较
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()
。缺点是
.ordinal()
不具有任何域语义,它仅反映您在代码中定义枚举常量的顺序。在这里使用它会为易于创建和难以发现的错误打开大门。
- 由于它不支持语义,开发人员在阅读您的代码中类似
month.ordinal() < otherMonth.ordinal()
的内容时可能会对此处比较的内容感到困惑,并且可能需要浏览源代码 (if 它可用)因此浪费时间,更重要的是,他们失去了对要解决的实际问题的心智模型。
提示:以单数命名枚举。类型的名称指的是单个实例,就像 class 的情况一样,例如 String
、List
等等。枚举只是具有固定数量实例的专用 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;
}
}
你好,我有 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
,我只想编写这样的方法 returnif (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()
。缺点是
.ordinal()
不具有任何域语义,它仅反映您在代码中定义枚举常量的顺序。在这里使用它会为易于创建和难以发现的错误打开大门。- 由于它不支持语义,开发人员在阅读您的代码中类似
month.ordinal() < otherMonth.ordinal()
的内容时可能会对此处比较的内容感到困惑,并且可能需要浏览源代码 (if 它可用)因此浪费时间,更重要的是,他们失去了对要解决的实际问题的心智模型。
提示:以单数命名枚举。类型的名称指的是单个实例,就像 class 的情况一样,例如 String
、List
等等。枚举只是具有固定数量实例的专用 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;
}
}