在阅读《Effective Java》时,我遇到了建议“使用枚举而不是 int
常量”。在我目前的项目中,我正在做类似于以下代码的事情:
int COL_NAME = 0;
int COL_SURNAME = 1;
table[COL_NAME] = "JONES"
我该如何使用枚举类型来实现这个功能呢?由于必须使用我被强制使用的接口,所以我必须使用一个int
作为我的索引。上面的示例只是一个示例。实际上我正在使用一个需要使用int
类型索引值的API。
应用一个有用的模式和一个反模式通常会失败 ;-)
在您的情况下,对于不是真正类似于数组的数据,使用数组会导致问题,当您想要将int
常量替换为enum
值时。
一种更为清晰的解决方案是使用EnumMap
,并将enum
值作为键。
或者,如果您确实必须使用,则可以使用table[COL_NAME.ordinal()]
。
如果某些API强制您传递int
值,但您可以控制实际值(即,您可以传递自己的常量),那么您可以在代码中切换到使用enum
值,并仅在代码与API接口的地方进行enum
转换。enumValue.ordinal()
的反向操作是EnumClass.values()[ordinal]
)。
听起来你正在尝试使用EnumMap。它是一个包装值数组的Map。
enum Column {
NAME, SURNAME
}
Map<Column, String> table = new EnumMap<Column, String>(Column.class);
table.put(Column.NAME, "JONES");
String name = table.get(Column.NAME);
classPerson {
String name;
String surname;
}
Person person = new Person();
person.name = "JONES";
String name = person.name;
根据需求而定。您可以使用Enum.ordinal()
将枚举转换为整数。
请注意,不可能直接将枚举作为索引传递。
编辑:
另一个可能性是使用Map<YourEnum, String> map
,然后使用map.get(EnumValue)
。
根据您的数组值,您可能会看到一个对象。例如,如果您的数组看起来像这样
person[FIRST_NAME] = "Jim Bob"
person[SURNAME] = "Jones"
person[ADDRESS] = "123 ABC St"
person[CITY] = "Pleasantville"
...
那么你真正想要的是这样的东西
Person jimBob = new Person("Jim Bob", "Jones");
jimBob.setAddress("123 ABC St", "Pleasantville", "SC");
....
请查看重构:用对象替换数组
我也遇到了这个问题,来自C++世界的我没有想到会遇到这个问题。
枚举的美妙之处在于可以创建一系列相关常量,具有唯一值,实际值并不重要。它们的使用使代码更易于阅读,并防止变量被设置为无效的枚举值(特别是在Java中),但在这种情况下,它是一个主要的痛点。虽然你可能有"enum Pets { CAT, BIRD, DOG }",并不真正关心CAT、BIRD和DOG实际上代表什么值,但写起来非常简洁明了: myPets[CAT] = "Dexter"; myPets[BIRD] = "Polly"; MyPets[DOG] = "Boo-Rooh";
在我的情况下,我最终编写了一个转换函数,您可以传入一个枚举值,我返回一个常量。我非常讨厌这样做,但这是我知道的保持枚举方便性和错误检查的唯一干净方法。
private int getPetsValue(Pets inPet) {
int value = 0;
switch (inPet) {
case CAT: value = 0; break;
case BIRD: value = 1; break;
case DOG: value = 2; break;
default:
assert(false);
value = 0;
break;
}
return value;
}
Enum.ordinal()
。我个人认为,最好不要像将Java当作C++那样编程,虽然两者相似但也有所不同,盲目地应用所有你习惯的方法只会导致灾难。 - maaartinus您可以像这样使用构造函数定义enum
:
public enum ArrayIndex {
COL_NAME(0), COL_SURNAME(1);
private int index;
private ArrayIndex(int index) {
this.index = index;
}
public int getIndex() {
return this.index;
}
};
然后像这样使用它:
public static void main (String args[]) {
System.out.println("index of COL_NAME is " + ArrayIndex.COL_NAME.getIndex());
}