2017-09-10 27 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

相关问题