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 の 2 つのインスタンスを作成するにはどうすればよいですか?

4

6 に答える 6

16

はい、インスタンスは暗黙的staticに andfinalです。これは、コードが賢明でないことを意味します。2 つのスレッドが両方とも を呼び出しているとしSINGLE.setOperation(Type)ます。あなたは自分が呼んでいるものに自信が持てなくなります。

Java 言語仕様のセクション 8.9から:

列挙型 (§8.9) は抽象宣言してはなりません。これを行うと、コンパイル時エラーが発生します。

列挙型は、クラス本体を持つ列挙型定数が少なくとも 1 つ含まれていない限り、暗黙的に final です。

列挙型を final として明示的に宣言すると、コンパイル時エラーになります。

ネストされた列挙型は暗黙的に静的です。ネストされた列挙型を static として明示的に宣言することは許容されます。

そして次のセクションでは:

列挙型の本体には、列挙定数を含めることができます。列挙定数は、列挙型のインスタンスを定義します。

各 enum 定数のインスタンスは 1 つしかないため、2 つのオブジェクト参照を比較するときに、そのうちの少なくとも 1 つが enum 定数を参照していることがわかっている場合は、equals メソッドの代わりに == 演算子を使用できます。

于 2013-06-18T10:40:59.647 に答える
11

操作の種類が異なる Operations.SINGLE の 2 つのインスタンスを作成するにはどうすればよいですか?

の背後にある基本的な考え方enumは、各メンバーのインスタンスが 1 つだけ存在するということです。SINGLEこれにより、別の場所や別MULTIPLEの場所で作成されたものがあることを恐れずに、安全に同等性を比較できます。

の複数のインスタンスが必要な場合はSINGLEclassではなく にしenumます。ミュータブルを間接的に作成したという事実enumは、同じ方向を指していenumます。あなたの状況では、使用は間違った選択です。

于 2013-06-18T10:38:41.000 に答える
10

Enum インスタンスは「静的」(つまり、静的変数のように動作する) ですが、不変ではありません。

すべてのスレッドは、列挙型名で参照される同じオブジェクトを参照します。これらはシングルトンのようなものであり、列挙型のインスタンスが 1 つだけ存在するという鉄壁の保証が JVM から得られます。列挙型のフィールドを変更すると、全員が変更されます。

finalフィールドを列挙型にして不変にすることは良い習慣です。

于 2013-06-18T10:37:29.383 に答える
0

はい、 のすべての要素はenumですstatic final constant。ただし、による別の回答で述べたようにdarijan、プログラムには論理的な誤りがあります。

于 2013-06-18T10:35:08.927 に答える
0

mainメソッドの 4 行目にエラーがあります

oper1.setOperation(Type.POST);

する必要があります

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