2017-09-10 59 views
3

與.NET相比,我沒有太多的Java經驗。在.NET中,枚舉被視爲整數的精簡包裝,因此您可以輕鬆創建未命名的枚舉值。例如:你能像Java中一樣在Java中創建一個未定義的枚舉值嗎?

// C# code 
public enum Colors { Red, Green, Blue } 

Console.Writeline(Colors.Red + " " + Colors.Green + " " + Colors.Blue); // Red Green Blue 

var unknown = (Colors)(-1); 
Console.WriteLine(unknown); // -1 

是否有可能在Java中做同樣的事情?

編輯:這似乎是從事實的情況下,該代碼將無法編譯:

// Java code 
enum Colors { R, G, B } 

static int f(Colors c) { 
    switch (c) { 
     case R: return 1; 
     case G: return 2; 
     case B: return 3; 
    } // Compiler complains about a missing return statement 
} 
+1

我當然希望不要!這聽起來像一個可怕的主意! –

+0

@JoeC我也同意。我有點迂腐,所以在我的.NET代碼中,我總是有一個'default:'情況,即每次開啓枚舉時我都會拋出異常,即使我已經處理了所有定義的值。我想知道我是否必須爲Java做同樣的事情。 –

+0

絕對不是。在Java中,枚舉是類型安全的,你根本無法表達這個概念。 –

回答

4

的Java實現enum不同的方式過C#中:而不是讓他們在int個瘦包裝,它使它們在物體周圍變薄,一個compiler-aided improvement on the type-safe enum pattern

編譯器確保無法創建未包含在該類型中的enum的實例。

每種方法都有優點和缺點。 C#靠近C和C++ enum s,其行爲與命名數字常量的集合相似。這使得創建[Flag]枚舉成爲可能 - 這對於Java enum來說是不可能的。另一方面,Java enums是完全工作的對象,完整地具有它們自己的方法,並且具有實現接口的能力。方法可以作爲擴展添加到C#enum中,但不可能實現一個接口。

+0

謝謝你的回答,這是非常豐富的(我upvoted)。你知道爲什麼我編輯過的代碼不能編譯嗎? –

+0

您需要添加案例的默認值,如:'default:throw new IllegalArgumentException();' – Florian

+0

@JamesKo我認爲這是編譯器的一個缺點。你可以傳遞給'f()'的唯一的其他值是'null',但是如果你這樣做了,'switch'語句就會崩潰。 – dasblinkenlight

相關問題