有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 5中引入的Enum类的用途是什么?

我的建议是:

1)要么enum只在编译之前存在(就像泛型一样;但我从来没有听说过任何关于它的事情,因为到处都写着编译后泛型被删除)

2)或枚举是以某种方式保持向后兼容性的一种方法(但我还没有看到这种方法)

还有其他建议吗?(顺便说一句,您是否在代码中使用过它?)

UPD:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

换句话说,有一个enum关键字和Enum类。它们都出现在Java5中。问题是:为什么我们两者都需要

第二个问题:为什么Enum成为API的一部分


共 (6) 个答案

  1. # 1 楼答案

    either enums exist only before compilation

    如果您在声明中讨论的是enum语法,而不是class语法,那么这是正确的。在字节码级别,Java枚举是与任何其他类一样的类。枚举语义基本上由Java编译器实现

  2. # 2 楼答案

    the Java Tutorials

    You should use enum types any time you need to represent a fixed set of constants. That includes natural enum types such as the planets in our solar system and data sets where you know all possible values at compile time—for example, the choices on a menu, command line flags, and so on.

    枚举非常有用,是的,我在代码中已经多次使用它们


    编辑:

    。。。有一个枚举关键字和枚举类。它们都出现在Java5中。问题是:为什么我们两者都需要

    这个问题类似于问“有一个class关键字和一个Object类。为什么我们需要两者?”

    在这两种情况下,关键字基本上都是对编译器的提示;您可以将它们视为语法糖,它可以节省您的击键次数,并让编译器做更少的工作(通过不让编译器猜测您所声明的内容)

    也见this q&a

    。。。您是否在代码中使用过它

    答案仍然是“是”特别是,Enum#valueOf()是一种用于解析字符串的静态方法:

    DayOfWeek d = Enum.valueOf(DayOfWeek.class, "TUESDAY");
    

    但这当然也行得通:

    DayOfWeek d = DayOfWeek.valueOf("TUESDAY");
    
  3. # 3 楼答案

    添加了Enum,因此Enum提供的功能是可见的,并有文档记录。隐藏这个类会有什么好处

    编译后不会删除泛型

    不确定为什么需要枚举类来实现向后兼容性

    我使用该类来读取枚举的作用,并在代码中检查枚举类型、valueOf等

    讽刺的是,这个问题就在你的问题之前。它显示了使用该类的示例Checking if a class is java.lang.Enum

  4. # 4 楼答案

    依我拙见,enum最主要的好处是类型安全

    假设您有一个函数,它可以通过具有固定可能性集的某个选项调用。说“销售”或“退货”。一个非常糟糕的解决方案是传入一个字符串,如:

    public void doTransaction(String type)
    {
      if (type.equals("sale"))
        ... do whatever ...
    }
    

    这种方法的一个大问题是,如果有人试着用“销售”或“航行”来称呼它。除非程序验证只传入有效的参数,否则拼写错误可能会产生神秘的错误

    好吧,许多程序员为此创建了常量:

    public final static int SALE=1, RETURN=2;
    public void doTransaction(int type)
    {
      if (type==SALE)
      ... do whatever ...
    }
    

    这好多了,但还是有问题。假设我们有两个参数:

    public final static int SALE=1, RETURN=2;
    public final static int DOMESTIC=1, FOREIGN=2;
    public void doTransaction(int type, int locale)
    {
      if (type==SALE && locale==DOMESTIC)
      ... etc ...
    }
    

    现在有人弄糊涂了,打电话给doTransaction(FOREIGN, SALE)。这将成功编译,通过程序内的任何有效性测试,并给出完全错误的结果。因为如果你没有抓住它,参数的顺序就错了

    枚举解决了这个问题。如果你改写

    enum SaleType {SALE, RETURN};
    enum Locale {DOMESTIC, FOREIGN};
    public void doTransaction(SaleType type, Locale locale)
    ... etc ...
    

    现在,如果有人试图写,doTransaction(Locale.FOREIGN, SaleType.SALE),他们会得到一个编译时错误,并立即知道他们的参数是错误的

  5. # 5 楼答案

    枚举的存在是为了表示类型安全的枚举(比使用int常量进行相同操作要好得多)

    如果您询问Enum类本身的用途是什么-它充当用户定义的enum的超类。每个枚举被编译成一个类,该类使用适当的泛型参数(即自身)扩展Enum

    为什么这是通过语法糖而不是简单的子类来实现的?首先,它强制执行枚举具有的特定语法(构成枚举成员的静态实例)。另一个原因可能是,子类Enum<E extends Enum<E>>所需的泛型操作对于以前从未见过任何泛型的开发人员来说将是非常困惑的。通过将这种复杂性隐藏在一个新的关键字后面,开发人员不必自己破译它。最后,关键字意味着它是一个特殊的构造,不应该像普通类一样对待它