请原谅初学者级别的问题,但我对枚举的隐式静态状态感到困惑。
一方面,你不能在方法中声明它们,因为它们是隐式静态的,你可以像任何其他静态类一样从静态上下文引用它们......但另一方面,在内部,它们引用自己作为"这"好像他们是一个实例。
代码示例:
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。
我知道枚举是一种特殊的类型,但我仍然试图理解一些非常规怪癖的原因。
当引用枚举常量时,是否存在某种工厂模式类型的自动构造?它究竟从静态类过渡到实例?
谢谢!
答案 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;
}
}
虽然静态声明,但每个常量的对象都可以提供可以调用的非静态方法。