我必须为所有开关情况定义ENUM。我不确定在涉及头寸时如何与枚举关联。以下是我的代码:如何定义与位置相关的开关情况的枚举
public enum Choice {
A, B, C
}
public void selectItem(int position) {
switch (position) {
// Dashboard
case 0:
break;
case 1:
break;
}
}
我必须为所有开关情况定义ENUM。我不确定在涉及头寸时如何与枚举关联。以下是我的代码:如何定义与位置相关的开关情况的枚举
public enum Choice {
A, B, C
}
public void selectItem(int position) {
switch (position) {
// Dashboard
case 0:
break;
case 1:
break;
}
}
您将需要改造INT位置,以各自的ENUM。每个枚举值默认都有一个序号。这里在Choice枚举中,A具有序数零等等。
public class TestMain {
public enum Choice {
A, B, C
}
public static void main(String[] args) {
selectItem(0);
}
public static void selectItem(int position) {
Choice selectedChoice = null;
selectedChoice = getChoiceFromPosition(position, selectedChoice);
switch (selectedChoice) {
//Dashboard
case A:
System.out.println(selectedChoice.ordinal());
break;
case B:
break;
case C:
break;
}
}
private static Choice getChoiceFromPosition(int position, Choice selectedChoice) {
for(Choice c : Choice.values()){
if(c.ordinal() == position) {
selectedChoice =c;
}
}
return selectedChoice;
}
}
通常,这是个坏主意。然而,为了一个序转换成它的枚举represantation你可能想这样做:
Choice value = Choice.values()[position];
下面你可以找到从Item 31: Use instance fields instead of ordinals(有效的Java,158页,约书亚·布洛克),其中描述了如何避免使用裁剪序。
永远不要从它的序号派生与枚举相关联的值;存储 它的一个实例字段,而不是
// Abuse of ordinal to derive an associated value - DON'T DO THIS public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } public enum Ensemble { SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8), NONET(9), DECTET(10), TRIPLE_QUARTET(12); private final int numberOfMusicians; Ensemble(int size) { this.numberOfMusicians = size; } public int numberOfMusicians() { return numberOfMusicians; } }
也改用枚举直接在交换机
public void selectItem(Choice x) {
switch (x) {
// Dashboard
case A:
break;
case B:
break;
}
}
public enum Choice {
A, B, C
}
public Choice selectItem(int position) {
return Choice.values()[position];
}
你可以尝试在枚举中添加一些方法来包含逻辑。
public enum Choice {
A, B, C;
static Choice[] values = Choice.values(); //so array not created defined every time.
public static Choice fromOrdinal(int position){
if(position<values.length){
return values[position];
}
return A; //default
}
}
//例如,当在android中选择微调器时,它将返回一个int位置。
//将这个位置映射到一个枚举,你可以调用如下的fromOrdinal()方法。
public void selectItem(int position) {
switch (Choice.fromOrdinal(position)) {
// Dashboard
case A:
break;
case B:
break;
...// the rest of your cases.
}
}
我认为你的意思是“序数”,而不是“红衣主教”。 –
@AndyTurner,是的。你是对的! –
这里有很多很好的答案。只需再添加一个,这非常优雅,值得考虑。
你可以让enum
做所有的工作。
interface Selectable {
public void selected();
}
public enum Choice implements Selectable {
A {
@Override
public void selected() {
System.out.println("We're all going to die!!!");
}
}, B{
@Override
public void selected() {
System.out.println("Everyone lives forever");
}
}, C{
@Override
public void selected() {
System.out.println("Nobody knows.");
}
};
}
这实际上完全消除了对switch ... case
语句的需要。
为什么不能'位置'是一个枚举类型? – Bathsheba
Choice.values()会给你一个枚举数组(带有它们的序数位置) –