Java中枚举的最常见用法是什么?

时间:2013-08-19 15:31:38

标签: java coding-style enums

在Java中使用枚举的最常见方法是什么? 鉴于我需要在类构造函数或工厂方法参数中使用枚举,我能想到的第一件事就是在我的类中包含公共静态enum并导入它。

package mypackage;
import mypackage.Data.ContentType;

class Data {
  public static enum ContentType { TYPE1, TYPE2, TYPE3 }  

  ContentType type;
  String value;

  public Data( String value, ContentType type ) {
    this.value = value;
    this.type = type;
  }
}

使用示例:new Data( "some value", ContentType.TYPE1 );

人们更喜欢使用如下建筑的原因是什么?

public static final int TYPE1 = 1;
public static final int TYPE2 = 2;
public static final int TYPE3 = 3;

5 个答案:

答案 0 :(得分:3)

我毫不犹豫地将此称为“常用”用法,但枚举非常适合制作some kinds of state machines

答案 1 :(得分:1)

好问题。 Enum最适合用于:

  1. 永远不会改变的固定数据集。如月份名称,工作日......等等。
  2. 防止在字符串中输入错误非常有用。如果您多次键入Januar,可能会输入错误,但如果使用Enum,则会在语法上进行检查。

答案 2 :(得分:1)

  1. 您可以将枚举用于当前对象状态,在您想要实施FSM时非常有用
  2. 正如njzk在评论中所说,enum允许您创建一组固定的数据
  3. 限制自己简单的枚举,不要忘记他们可以有参数和方法
  4. 考虑这样的事情(在现实世界的例子中可能没什么用,但它用于向你展示一些功能)

    public enum Operations{ ADD,SUB,...;
     public int execute(int a, int b)
     {
        switch(this)
        {
        case ADD:
         return a+b;
        case SUB:
         return a-b;
             ....
            }
     }
    }
    

    现在你可以有方法

    public int execute(Operations op,int a, int b)
    {
    return op.execute(a,b);
    }
    

    为不同的枚举值

    返回不同的结果

答案 3 :(得分:0)

使用枚举提供了一系列明显的优势,因为如果switch语句中缺少任何一个,编译器会检查你,并且不能使用声明的值之外的值。

有些人可能会继续使用常量,或者因为他们的代码可能被编译成其他语言。主要是因为它们没有遇到枚举,在大多数情况下,Enum比这些常量更好。

答案 4 :(得分:0)

这是我宣布为Enum的一个类,以及下面的几个原因:

  
      
  1. 通过合成包含Award引用的对象不需要在每次添加一个新的Award对象时创建它(Read   使用Enums与使用Singletons)。
  2.   
  3. 由于Enums是实例控制的,当我需要比较奖励时,我可以使用==运算符而不是.equals(),并保存自己   (悲惨)CPU时间。
  4.   
  5. 总的来说,当你有机会从一个集合中重用现有的不可变对象而不是创建新的对象时,使用Enums。
  6.   
public enum Award {
    /*List of possible awards */
    FIRST_AWARD("FIRST_AWARD", "FIRST_AWARD_IN_THE_LIST", "./firstAward.jpg"),
    SECOND_AWARD("SECOND_AWARD", "SECOND_AWARD_IN_THE_LIST", "./secondAward.jpg"),
    THIRD_AWARD("THIRD_AWARD", "THIRD_AWARD_IN_THE_LIST", "./thirdAward.jpg");      

    private final String name;
    private final String description;
    private final String imageLink; 

    Award (String name, String description, String imageLink){
        this.name = name;
        this.description = description;
        this.imageLink = imageLink;
    }

...
}