关于java:Enums,静态方法和实现接口方法有什么用?

Enums, What's the use of static methods and implementing interface methods?

我对Enums有一些小小的怀疑。我有以下困惑:

  • static方法在Enums中的用途是什么?我们大多使用Enums来声明常量。此功能的用途是什么?
  • 我明白了,一个Enum可以实现一个接口。有什么用?我只是对现实生活的使用感到困惑。
  • 另一个困惑是,参见下面的代码片段,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    enum Position {
        FIRST, SECOND, THIRD;
        public static void main(String[] args) { //line 1
            Position p = Position.SECOND; //line 2
            switch(Position.THIRD) { //line 3
                case FIRST: //line 4
                    System.out.println("Congrats, You are the winner");//line 5
                    break; //line 6
                case SECOND : //line 7
                    System.out.println("Congrats, You are the runner");//line 8
                    break; //line 9
                default : //line 10
                    System.out.println("Better luck next time"); //line 11
            }
        }
    }

    如果在case语句中使用,如Position。首先,它给出一个编译时错误。我理解JLS不允许这样做。写的原因是用一个类格式,它不能做符号链接。但事实恰恰相反。和第3行一样,我使用的是具有完全限定名的Enum。所以,我的观点是,符号链接的含义是什么,为什么第3行也被允许?

  • 注释这基本上是个打字错误。我的主要问题是,我们在switch条件(编译器允许)中使用语法position.third,但在case中使用相同的语法时,它是不允许的。为什么会这样?

    从JLS报价

    (One reason for requiring inlining of constants is that switch
    statements require constants on each case, and no two such constant
    values may be the same. The compiler checks for duplicate constant
    values in a switch statement at compile time; the class file format
    does not do symbolic linkage of case values.)

    这里提到了符号链接。但当我在switch(Position.THIRD)的切换条件下写这样的东西时,它被允许出现在case的声明中。


    What is the use of static methods in Enums?

    与其他类型相同。对于枚举,它们通常是"给定这个字符串值,返回等价的枚举"或类似的东西。(在valueOf不合适的情况下,例如有多个表示。)

    I see, an Enum can implement an interface. What would be the use?

    与任何接口相同-将实现与使用分离。例如,我以前让Enums实现了一个与本地化相关的接口。

    My main question was, we are using syntax Position.THIRD in switch condition(which is allowed by compiler) but when we use same syntax in case, it is not allowed. Why is that?

    这只是一个语言决定-枚举类型必须与开关值本身的类型相同,所以它是冗余信息。这与您引用的JLS部分无关。


    枚举和普通类非常相似,只是它们在实例化上有一定的限制,并且不能扩展类等。

    静态方法通常是返回枚举实例的工厂方法,通常查找字段与参数匹配的实例。请参阅此示例。

    枚举可以有字段、getter和setter以及其他方法,因此可以实现接口,包括通用接口。请参阅此示例。

    当需要有限集(如果命名实例)时,可以使用枚举而不是类。


    Enums可以制作非常漂亮的单体…这基本上回答了你所有的问题。)