java enum变量是静态的吗?

Opt*_*nal 7 java enums

public enum Operations {

    SINGLE,
    MULTIPLE;

    private Type operation;

    public void setOperation(Type operation) {
        this.operation = operation;
    }

    public Type getOperation() {
        return operation;
    }

    public static void main(String[] args) {
        Operations oper1 = Operations.SINGLE;
        oper1.setOperation(Type.GET);

        Operations oper2 = Operations.SINGLE;
        oper2.setOperation(Type.POST);
        System.out.println(oper1.getOperation());
        System.out.println(oper2.getOperation());
    }
}

enum Type {
    POST,
    GET;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,两个操作的操作值都会发生变化.如何使用不同操作类型的两个Operations.SINGLE实例?

Eri*_*low 16

是的,情况是含蓄staticfinal.这意味着代码是不明智的.想象两个线程都在呼叫SINGLE.setOperation(Type); 你对你所说的话毫无信心.

Java语言规范,第8.9节:

枚举类型(第8.9节)不得声明为抽象; 这样做会导致编译时错误.

枚举类型是隐式final的,除非它包含至少一个具有类主体的枚举常量.

将枚举类型显式声明为final是一个编译时错误.

嵌套枚举类型是隐式静态的.允许将嵌套的枚举类型显式声明为静态.

在下一节中:

枚举类型的主体可能包含枚举常量.枚举常量定义枚举类型的实例.

因为每个枚举常量只有一个实例,所以当比较两个对象引用时,允许使用==运算符代替equals方法,如果已知它们中至少有一个引用枚举常量.


das*_*ght 11

如何使用不同操作类型的两个Operations.SINGLE实例?

背后的基本思想enum是每个成员都有一个且只有一个实例.这使得您可以安全地比较它们的平等性,而不必担心其他地方SINGLEMULTIPLE在其他地方创建.

如果你想要多个实例SINGLE,请将其设为a class,而不是a enum.你使你的enum可变性间接指向同一方向的事实:enum在你的情况下使用是一个错误的选择.


Boh*_*ian 10

枚举实例是"静态的"(即表现得像静态变量),但不是不可变的.

所有线程都看到枚举名称引用的同一个对象 - 它们就像单身一样,来自JVM的铁壳保证只有一个枚举实例.更改枚举的字段会为每个人更改它.

优良作法是final在枚举中创建字段并使其不可变.