由于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枚举有哪些好的替代方案?
答案 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()
{
...
}
}
其中equals
和hashCode
正在使用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环境提供良好的语法指导。