由于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使用的是类型安全枚举模式在书中最好的形容有效的Java通过乔希布洛赫 。 然而,它有一定的局限性,尤其是当你在处理不同的类加载器,系列化等特点。
您还可以看看在Apache Commons Lang中的项目和espacially枚举类,像约翰写。 正是这种模式的实现和支持创建自己的枚举。
我通常会创建我称之为不变类,像这样一些事情:
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
。
阿帕奇共享郎有一个枚举类是工作得很好,非常好介绍什么的Java 5枚举提供。
如果应用程序代码将使用大量的枚举的,那么我宁愿以下解决方案,我在我的应用程序使用了。
基类
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);
}
这又是不是针对任何整数值intitializing衍生枚举对象的充分证明。 然而,它可以提供良好的语法指导非枚举环境中工作。