Java 1.4中枚举的替代方法

时间:2009-06-24 13:26:46

标签: java enums java1.4

由于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 个答案:

答案 0 :(得分:28)

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

你也可以看一下Apache Commons Lang项目,特别是enum类,就像John写的那样。它是这种模式的一种实现,支持构建自己的枚举。

答案 1 :(得分: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

答案 2 :(得分:6)

Apache Commons Lang有一个Enum class,效果很好,很好地涵盖了Java 5 Enums提供的功能。

答案 3 :(得分: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对象进行初始化。但它可以为非enum环境提供良好的语法指导。