java enum变量是静态的吗?

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; } 

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

是的,实例是隐式staticfinal 。 这意味着代码是不明智的。 想象两个线程都调用SINGLE.setOperation(Type) ; 你对你所说的话毫无信心。

从Java语言规范,第8.9节 :

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

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

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

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

在下一节中:

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

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

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

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

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

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

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

优良作法是让你的字段在枚举中final并使它们不可变。

我已经一年半了。 但我看到这个问题没有得到真正回答。

解决方案是使用类而不是枚举,它将这两个枚举作为其字段:

 class Operation { Quantity quantity; Type type; Operation(Quantity quantity, Type type) { this.quantity = quantity; this.type = type; } } 

当然,您可以使用枚举而不是类。 然后你必须枚举所有组合:

 enum Operation { SINGLE_GET(Quantity.SINGLE, Type.GET) SINGLE_POST(Quantity.SINGLE, Type.POST) MULTIPLE_GET(Quantity.MULTIPLE, Type.GET) // ... more options // contents same as in class Operation, constructor private by default } 

这两种方法都是有效的,有时你真的想要枚举所有的组合,大多数时候,你应该坚持使用class方法。

为简洁起见,我没有定义枚举QuantityType ,它们只是简单的枚举。

是的, enum所有元素都是static final constant 。 但是正如darijan在另一个回答中所darijan ,你的程序中存在逻辑错误。

main方法第四行出错

 oper1.setOperation(Type.POST); 

应该

 oper2.setOperation(Type.POST);