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() { ... } }
其中equals
和hashCode
使用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环境提供良好的语法指导。