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

2022-09-01 08:21:10

在阅读《有效的Java》时,我遇到了“使用枚举而不是常量”的建议。在当前的项目中,我正在做类似下面的事情:int

int COL_NAME = 0;
int COL_SURNAME = 1;

table[COL_NAME] = "JONES" 

我如何使用枚举来实现此目的?由于我被迫使用的接口,我必须为我的索引使用。上面的例子只是一个例子。我实际上使用的是一个 API,它采用 for 索引值。intint


答案 1

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

在您的例子中,当您想要用值替换常量时,对不是真正类似数组的数据使用数组会带来问题。intenum

一个 clean(er) 解决方案类似于 EnumMap,其中的值是键。enum

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

如果某些 API 强制您传递值,但您可以控制实际值(即,您可以传递自己的常量),则可以切换到在代码中使用值,并仅在代码与 API 接口的位置进行转换。的反向操作是 )。intenumenumenumValue.ordinal()EnumClass.values()[ordinal]


答案 2

这听起来像是你试图使用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);

如果您使用POJO,这将简单得多。

classPerson {
   String name;
   String surname;
}

Person person = new Person();
person.name = "JONES";
String name = person.name;