如果枚举是隐式静态的,为什么它们能够在内部使用“this”关键字?

时间:2014-06-17 21:38:43

标签: java static enums

请原谅初学者级别的问题,但我对枚举的隐式静态状态感到困惑。

一方面,你不能在方法中声明它们,因为它们是隐式静态的,你可以像任何其他静态类一样从静态上下文引用它们......但另一方面,在内部,它们引用自己作为"这"好像他们是一个实例。

代码示例:

public class EnumTest {

  enum Seasons{
      SUMMER,
      FALL,
      WINTER,
      SPRING;

      public String toString()
      {
          switch(this)
          {
              case SUMMER:
                  return "Hot Summer";
              case FALL:
                  return "Colorful Fall";
              case WINTER:
                  return "Crisp Winter";
              case SPRING:
                  return "Allergy Season";
              default
                  return "wth?";

          }
      }
  }
public static void main(String[] args)
{
   System.out.println(EnumTest.Seasons.SUMMER.toString());
}

}

注意在枚举定义中的toString()内部,有一个开关"这个"。

在静态方法main中,以典型的静态类方式访问Enum。

我知道枚举是一种特殊的类型,但我仍然试图理解一些非常规怪癖的原因。

当引用枚举常量时,是否存在某种工厂模式类型的自动构造?它究竟从静态类过渡到实例?

谢谢!

2 个答案:

答案 0 :(得分:8)

枚举类中定义的常量是唯一隐式static的东西。它接近(但不完全相同):

public static final Seasons SUMMER = new Seasons();
public static final Seasons FALL = new Seasons();
public static final Seasons WINTER = new Seasons();
public static final Seasons SPRING = new Seasons();

这允许您编写Seasons.SUMMER等代码。

类主体的其余部分就像普通的类主体一样 - public String toString()不是隐含的static,因此它可以访问this

答案 1 :(得分:3)

将枚举常量视为静态声明的对象,如下所示:

class A {

    public final static A FOO = new A ("FOO");
    public final static A BAR = new A ("BAR");

    private final String text;

    private A(String text) {
        this.text = text;
    }

    public String toString() {
        return this.text;
    }

}

虽然静态声明,但每个常量的对象都可以提供可以调用的非静态方法。