14

由于 Java 1.4 没有枚举,我正在做这样的事情:

public class SomeClass {
     public static int SOME_VALUE_1 = 0;
     public static int SOME_VALUE_2 = 1;
     public static int SOME_VALUE_3 = 2;

     public void receiveSomeValue(int someValue) {
            // do something
     }
 }

receiveSomeValue 的调用者应该传递这 3 个值中的一个,但他可以传递任何其他 int。如果它是一个枚举,则调用者只能传递一个有效值。

receiveSomeValue 应该抛出 InvalidValueException 吗?

Java 5 枚举有哪些好的替代方案?

4

4 回答 4

28

最好在 1.5 之前使用的是Typesafe Enum Pattern ,它在Josh Bloch 的《Effective Java》一书中得到了最好的描述。但是它有一些限制,特别是当你处理不同的类加载器、序列化等时。

您还可以查看 Apache Commons Lang 项目,尤其是 enum 类,就像 John 所写的那样。它是这种模式的一种实现,并支持构建您自己的枚举。

于 2009-06-24T13:31:37.823 回答
7

我通常会创建我称之为常量类的东西,如下所示:

public class MyConstant 
{
  public static final MyConstant SOME_VALUE = new MyConstant(1);
  public static final MyConstant SOME_OTHER_VALUE = new MyConstant(2);
  ...

  private final int id;


  private MyConstant(int id)
  {
    this.id = id;
  }

  public boolean equal(Object object) 
  {
    ...
  }

  public int hashCode() 
  {
    ...
  }
}

在哪里equalshashCode正在使用id.

于 2009-06-24T13:33:15.277 回答
6

Apache Commons Lang 有一个运行良好的Enum 类,并且很好地涵盖了 Java 5 Enums 提供的功能。

于 2009-06-24T13:29:01.777 回答
0

如果应用程序代码库将使用大量枚举,那么我更喜欢我在我的应用程序中使用的以下解决方案。

基类

public class Enum {
    protected int _enumValue;
    protected Enum(int enumValue) {
        this._enumValue = enumValue;
    }

    public int Value() {
        return this._enumValue;
    }
}

然后,您的枚举将遵循这些模式

实际枚举

public class DATE_FORMAT extends Enum {
    public static final int DDMMYYYY = 1;
    public static final int MMDDYYYY = 2;
    public static final int YYYYMMDD = 3;

    public DATE_FORMAT(int enumValue) {
        super(enumValue);
    }
}

您的代码可以按如下方式使用此枚举

String getFormattedDate(DATE_FORMAT format) {

    String sDateFormatted = "";

    switch (format.Value()) {

        case DATE_FORMAT.DDMMYYYY : 
            break;
        case DATE_FORMAT.MMDDYYYY :
            break;
        case DATE_FORMAT.YYYYMMDD :
            break;
        default:
            break;
    }

    return sDateFormatted;
}

调用者可以将该函数用作

void callerAPI() {
    DATE_FORMAT format = new DATE_FORMAT(DATE_FORMAT.DDMMYYYY);

    String sFormattedDate = getFormattedDate(format);

}

这还不能完全证明使用任何整数值初始化派生 Enum 对象。然而,它可以为在非枚举环境中工作提供良好的句法指南。

于 2013-03-05T17:19:57.527 回答