Java 在枚举类型中使用整数

Java 在枚举类型中使用整数,java,enums,Java,Enums,我正在尝试声明此枚举: public enum Month { 1, 2, 3, 4, 5 , 6, 7, 8, 9, 10, 11, 12; } 但当我试图编译时,它不起作用。这是因为常量是整数吗?是-枚举的值必须是有效标识符。毕竟,它们基本上是静态字段-您实际上是在试图声明: public static Month 1 = new Month(); 这显然是无效的 有关详细信息,请参见,尤其是本产品: 枚举常数: 注释标识符参数pt ClassBodyopt 正如@Jon Ske

我正在尝试声明此枚举:

public enum Month {
    1, 2, 3, 4, 5 , 6, 7, 8, 9, 10, 11, 12;
}

但当我试图编译时,它不起作用。这是因为常量是整数吗?

是-枚举的值必须是有效标识符。毕竟,它们基本上是静态字段-您实际上是在试图声明:

public static Month 1 = new Month();
这显然是无效的

有关详细信息,请参见,尤其是本产品:

枚举常数:
注释标识符参数pt ClassBodyopt


正如@Jon Skeet所说的,您不能在代码中使用整数作为标识符。您可以做的最接近的事情是将整数值与常量关联:

public enum Month {
   ONE(1),
   TWO(2);

   private final int number;

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

   public int getNumber() { return number; }
}
这样你就可以这样做:

Month.ONE.getNumber()

但不确定这是否适合您的需要。

您使用这种可怕的解决方法

public enum Month {
  JANUARY(1),
  FEBRUARY(2),
  ...
  DECEMBER(12);

  private int number;

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

  public int getNumber() {
    return number;
  }
}
public enum Month {
    _1, _2, _3, _4, _5 , _6, _7, _8, _9, _10, _11, _12;
}
然而,另一种方法是对数字使用name和ordinal()

public enum Month {
    None, 
    January, February, March, April, May, June, 
    July, August, September, October, November, December
}

Month month = Month.January;
int num = month.ordinal(); // == 1
Month month2 = Month.values()[num]; // == January.

有什么办法可以用整数吗?我可以把它们声明为字符串,以后再把它们解析成整数吗?@James:不清楚你的意思。您正在声明成员,这些成员必须具有有效的标识符。您将无法引用月份。1,不。啊,这并不真正符合我的需要,但我现在更了解枚举。我的问题是,我必须创建自己的日历类(我知道有一个日历类,但我们需要创建自己的日历类)。我们被告知要使用枚举。老实说,我不确定我应该使用枚举类型做什么。你能给我一些例子说明在哪里使用这些吗?
enum
s可以用来创建一个数据类型,它只包含一小部分可能的值。对于
enum
类型,工作日和月份实际上是最流行的示例。我不知道为什么您认为枚举不适合您的日历应用程序。我不认为它们不适合我的类,我只是不熟悉它们,所以我正在尝试了解应该在哪里使用它们。所以,若我声明了一个enum类型的工作日,那个么我可以用它做什么呢?首先:enum可以做其他类可以做的任何事情。您可以仅为任何其他类声明成员和方法。唯一的例外是您不能创建枚举类的新实例—Java会为您创建新实例。
Weekday
enum可以保存其他数据,如
name
(星期一)、
shortName
(星期一)或布尔标志
isWeekend
。由于枚举实例是公共静态final,因此您可以从任何地方访问该数据:
Weekday.MONDAY.isWeekend()
。当您以后在
Day
类中使用
Weekday
时,如果(Day.getWeekday().isweekday()){…}通常不鼓励使用序数(有效的Java等),您可以这样做。如果您想要索引,通常最好显式地分配它们。说明为什么不建议这样做会很有帮助。否则,听起来需要做更多的工作来完成Java为您所做的事情。我倾向于赞同YAGNI原则。以下是有效的Java对此的看法:“这是一场维护噩梦。如果对常量重新排序,该方法将中断。如果要添加与已使用的int值关联的第二个枚举常量,则可能会出现问题。此外,如果不为所有中间的int值添加常量,则不能为int值添加常量。“这些要点实际上并不适用于这种情况,但我想,如果您以相同的方式使用所有枚举,则更利于保持一致性(此处应用了have-to-have-a-dummy-constant)。”诚然,这并不像灵活的维护那样明智。给你一个月变化频率的概念,9月是指7日,10月是指8日,非9月是指9日,12月是指10日。上一次重新订购的月份是1583年,3月份曾经是第一个月,但名称没有改变。这取决于项目是否遵循标准或更重要。