在Java中使用数组索引的枚举

K2J*_*K2J 32 java enums

在阅读Effective Java时,我遇到了"使用枚举而不是int常量"的建议.在当前的项目中,我正在做类似下面的事情:

int COL_NAME = 0;
int COL_SURNAME = 1;

table[COL_NAME] = "JONES" 
Run Code Online (Sandbox Code Playgroud)

我将如何使用枚举来实现这一目标?由于我被迫使用的接口,我必须使用intfor我的索引.上面的例子只是一个例子.我实际上使用的是一个带int索引值的API .

Joa*_*uer 50

将一个有用的模式与反模式一起应用通常会失败;-)

在您的情况下,当您想要intenum值替换常量时,使用数组来表示非真实数组的数据会产生问题.

一个干净的(呃)解决方案就像EnumMapenum值作为键一样.

或者你可以使用,table[COL_NAME.ordinal()]如果你绝对必须.

如果某些API强制您传递int值但您可以控制实际值(即您可以传递自己的常量),那么您可以切换到使用enum代码中的值并enum仅在代码接口的位置转换为/从使用API​​.反向操作enumValue.ordinal()EnumClass.values()[ordinal]).

  • 我不同意这是一种反模式.其他语言将enum视为基元,并且在枚举基础上包含范围,子范围和数组非常有意义.它比需要声明`static final int ... SOMETHING`并写`select(...){..}`语句*imho*更有意义.其次,我们需要一个"EnumMap"的事实是*表面上的证据,证明缺少某些东西. (3认同)

Pet*_*rey 7

听起来你正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

如果你使用POJO,这会简单得多.

classPerson {
   String name;
   String surname;
}

Person person = new Person();
person.name = "JONES";
String name = person.name;
Run Code Online (Sandbox Code Playgroud)