我必須爲所有開關情況定義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()會給你一個枚舉數組(帶有它們的序數位置) –