2

列挙型を明示的にインスタンス化しようとすると、コンパイル時エラーになります

(§15.9.1)。Enum の final clone メソッドにより、enum 定数が複製されないことが保証され、シリアル化メカニズムによる特別な処理により、逆シリアル化の結果として重複するインスタンスが作成されないことが保証されます。列挙型の反射的なインスタンス化は禁止されています。これら 4 つのことにより、enum 定数によって定義されたものを超えて enum 型のインスタンスが存在しないことが保証されます。

enum 宣言以外の enum 型のインスタンスが多いことの欠点は何ですか?

4

5 に答える 5

5

欠点は、列挙型の静的なチェック可能性を捨てていることです。

switch列挙値の a が実際にすべてのケースを処理することを静的に確認できます。列挙型を使用してメソッドを呼び出すと、正常に動作することを静的に確認できます。リソース バンドル内のすべての列挙値の翻訳があることを静的に確認できます。そして、もっと多くのこと。

列挙型equals()と同等であることを確認できます。==

これらすべてが を定義enumます。

列挙型に「似た」ものが必要な場合は、それを記述してください。それほど難しくありません。

于 2011-01-27T12:23:47.180 に答える
2

それは比較を壊します。あなたがしたい

if (myEnumValue == yourEnumValue)
{
}

同じ列挙値の複数のインスタンスが存在する可能性がある場合、このような参照ベースのテストが機能するという保証はありません。文字列と比較してください。

于 2011-01-27T12:24:59.943 に答える
1

人々は を使用して列挙型と比較できることを期待しているため、混乱を招くと思い==ます。複製できると、セマンティクスが壊れます。

于 2011-01-27T12:26:21.827 に答える
0

他のすべての良い答えに加えて、それは壊れEnumSetます。EnumSetは、列挙型のサイズに応じて、単一longまたは の配列として実装されlongます。各ビットは、1 つの特定の列挙型値の包含または除外を表します。列挙型の数と順序が一定でない場合、これは機能しません。

于 2011-01-27T16:00:21.470 に答える
0

2 つの列挙型がある場合、次の命令は true または false になる可能性があります...

public boolean isEnumBlack(EnumType enum) {
    if (enum == EnumType.BLACK) {
        return true;
    } else {
        return false;
    }
}

次に、EnumType の「インスタンス」である BLACK を使用してこのメ​​ソッドを呼び出した場合、true は返されません。

isEnumBlack(BLACK)コードによればtrueを返すはずですが、falseを返します。列挙型はもはや列挙型ではありません!

于 2011-01-27T12:41:36.963 に答える