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 实例?

4

6 回答 6

16

是的,实例是隐含的staticfinal。这意味着代码是不明智的。想象两个线程都在调用SINGLE.setOperation(Type);你对你的呼唤没有信心。

来自Java 语言规范,第 8.9 节

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

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

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

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

在下一节中:

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

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

于 2013-06-18T10:40:59.647 回答
11

如何拥有两个具有不同操作类型的 Operations.SINGLE 实例?

an 背后的基本思想enum是它的每个成员都有一个,而且只有一个实例。这就是让您安全地比较它们是否相等的原因,而不必担心在其他地方存在另一个SINGLEMULTIPLE在其他地方创建。

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

于 2013-06-18T10:38:41.000 回答
10

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

所有线程都看到枚举名称所指的同一个对象——它们就像单例一样,JVM 有一个铁定的保证,即只有一个枚举实例。更改枚举的字段会改变每个人。

final将字段放在枚举中并使其不可变是一种很好的做法。

于 2013-06-18T10:37:29.383 回答
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,它们只是简单的枚举。

于 2015-02-02T10:31:42.830 回答
0

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

于 2013-06-18T10:35:08.927 回答
0

main第四行方法有错误

oper1.setOperation(Type.POST);

应该

oper2.setOperation(Type.POST);
于 2013-06-18T10:35:15.733 回答