0

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

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;
4

5 回答 5

3

我不愿将其称为“常见”用法,但枚举非常适合制作某些类型的状态机

于 2013-08-19T15:42:46.150 回答
1
  1. 您可以将枚举用于对象的当前状态,这在您想要实现 FSM 时很有用
  2. 正如 njzk 在评论中所说,枚举允许您创建一组固定的数据
  3. 限制自己使用简单的枚举,不要忘记它们可以有参数和方法

考虑类似的事情(在现实世界的例子中可能没有用,但它可以向您展示一些功能)

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);
}

对于不同的枚举值,它会返回不同的结果

于 2013-08-19T15:45:40.997 回答
1

好问题。AnEnum最适合用于:

  1. 一组永远不会改变的固定数据。如月份名称,工作日..等
  2. 防止在字符串中输入错误非常有用。Januar如果您多次键入它,您可能会输错,但是使用Enum,它会在语法上进行检查。
于 2013-08-19T15:43:06.703 回答
0

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

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

于 2013-08-19T15:54:02.093 回答
0

这是我声明为 Enum 的一个类,以及以下几个原因:

  1. 通过组合包含 Award 引用的对象不需要在每次添加一个新的 Award 对象时创建一个新的 Award 对象(继续阅读使用枚举与使用单例)。
  2. 由于枚举是实例控制的,因此当我需要比较奖项时,我可以使用 == 运算符而不是 .equals(),并为自己节省一点(痛苦的)CPU 时间。
  3. 因此,总的来说,当您有机会重用集合中现有的不可变对象而不是创建新对象时,请使用枚举。
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;
    }

...
}
于 2013-08-19T15:54:28.310 回答