2013-06-18 71 views
7
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实例?Java枚举变量是静态的吗?

+1

如果您告诉我们打印到标准输出的内容,您的问题会更容易理解。 (我假设它打印两次“POST”?) –

+0

SINGLE相当于public static final操作SINGLE = new操作(“SINGLE”,0) – Blackbelt

回答

12

是的,实例隐含地为staticfinal。这意味着代码是不明智的。设想两条线索都叫SINGLE.setOperation(Type);你会对你打来的电话没有信心。

Java Language Specification, Section 8.9

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

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

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

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

而且在下一节:

枚举类型可含有枚举常数的机构。一个枚举常量定义了枚举类型的一个实例。

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

0

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

0

有一个在main方法的第四行的误差

oper1.setOperation(Type.POST); 

应该是

oper2.setOperation(Type.POST); 
+0

这是代码中的错字 – Optional

10

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

所有线程都看到枚举名称引用同一个对象 - 他们喜欢单身,从JVM铁一般的保证,只有过一个枚举的实例。更改枚举的字段会改变每个人的字段。

这是很好的做法,让您的字段枚举final,并让他们一成不变的。

11

怎样才可以有不同的操作类型Operations.SINGLE的两个实例?

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

如果您想要SINGLE的多个实例,请将其设置为class而不是enum。事实上,你让你的enum可变的间接点在相同的方向:使用enum是一个错误的选择在你的情况。

2

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

解决办法是使用类而不是枚举,有这两个枚举作为其字段:

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,它们只是简单的枚举。