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实例?
是的,实例是隐式static
和final
。 这意味着代码是不明智的。 想象两个线程都调用SINGLE.setOperation(Type)
; 你对你所说的话毫无信心。
从Java语言规范,第8.9节 :
枚举类型(第8.9节)不得声明为抽象; 这样做会导致编译时错误。
枚举类型是隐式final的,除非它包含至少一个具有类主体的枚举常量。
将枚举类型显式声明为final是一个编译时错误。
嵌套枚举类型是隐式静态的。 允许将嵌套的枚举类型显式声明为静态。
在下一节中:
枚举类型的主体可能包含枚举常量。 枚举常量定义枚举类型的实例。
因为每个枚举常量只有一个实例,所以当比较两个对象引用时,允许使用==运算符代替equals方法,如果已知它们中至少有一个引用枚举常量。
如何使用不同操作类型的两个Operations.SINGLE实例?
enum
背后的基本思想是每个成员都有一个且只有一个实例。 这使得您可以安全地比较它们的相等性,而不必担心在其他地方创建了另一个SINGLE
或MULTIPLE
。
如果您想要多个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
方法。
为简洁起见,我没有定义枚举Quantity
和Type
,它们只是简单的枚举。
是的, enum
所有元素都是static final constant
。 但是正如darijan
在另一个回答中所darijan
,你的程序中存在逻辑错误。
main
方法第四行出错
oper1.setOperation(Type.POST);
应该
oper2.setOperation(Type.POST);