Java 1.4中枚举的替代方案

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 的调用者应传递这三个值之一,但他也可以传递任何其他 int 值。如果它是枚举类型,调用者只能传递一个有效的值。

receiveSomeValue 是否应该抛出 InvalidValueException 异常?

除了 Java 5 枚举之外,还有哪些好的替代方案?


3
我很好奇:仍然使用Java 1.4的原因是什么? - Konrad Rudolph
我建议将这个事实(移动设备)添加到问题标题中。 - David Rabinowitz
2
很多人仍在使用1.4版本,我并没有看到问题。 - Jim
4个回答

28

在1.5版本之前,最好使用类型安全枚举模式,这个模式在Josh Bloch的书《Effective Java》中有详细描述。然而,该模式在处理不同类加载器、序列化等方面存在一些限制。

您还可以查看Apache Commons Lang项目,特别是像John编写的枚举类。它是该模式的一个实现,并支持构建自己的枚举。


亲爱的罗纳德,第一个链接已经失效了。你能否修复一下呢?谢谢。 - RestInPeace
我用另一个链接替换了原始链接。希望能有所帮助。 - Roland Schneider
亲爱的罗纳德,链接已经失效了。你能修复一下吗?谢谢。 - dardy

8

我通常会创建一个常量类,类似于这样:

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


6

Apache Commons Lang提供了一个枚举类,与Java 5的枚举类相当接近并且实现得很好。


链接已经失效,请您帮忙修复一下? - Vladimir Ivanov

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

}

这还不能完全保证使用任何整数值初始化派生的枚举对象。但是它可以为在非枚举环境中工作提供良好的语法指导。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接