Java 1.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枚举的好方法?

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

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

我通常创建我称之为常量类的东西,有些东西是这样的:

 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

Apache Commons Lang有一个Enum类 ,它运行良好,很好地涵盖了Java 5 Enums提供的内容。

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

基类

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

来电者可以使用该function

 void callerAPI() { DATE_FORMAT format = new DATE_FORMAT(DATE_FORMAT.DDMMYYYY); String sFormattedDate = getFormattedDate(format); } 

这还不能完全certificate使用任何整数值对派生的Enum对象进行初始化。 但它可以为非enum环境提供良好的语法指导。