2011-06-24 67 views
0

我有一個Java文件的以下部分:Java的switch語句來操縱的Enum情況下

Integer x; Integer y; Face facing; 

enum Rotate { Clockwise, Anticlockwise }; 

enum Face { East, North, West, South }; 

時遇到了問題搞清楚如何實現一個函數來改變對象的臉部(即方向該對象正面臨着)。

功能如下開始

private void rotateIt(Rotate rotateIt) { 
    { 

我已經使用switch語句如下開始(下面的文字裏面上面括號):

switch (facing) 
case North : ...?; 
case West : ...?; 
case East : ...?; 
case South : ...?; 

我想用Clockwise枚舉將其從East變爲South等和Anticlockwise做相反的IYGWIM。

+0

這功課嗎? – Bueller

+0

這個詞是CounterClockwise – Woot4Moo

回答

4
switch (facing) { 
    case North : facing=rotateIt==Rotate.Clockwise?Face.East:Face.West; break; 
    case West : facing=rotateIt==Rotate.Clockwise?Face.North:Face.South; break; 
    case East : facing=rotateIt==Rotate.Clockwise?Face.South:Face.North; break; 
    case South : facing=rotateIt==Rotate.Clockwise?Face.West:Face.East; break; 
} 

我應該得到你的成績有很大%的追溯!

+0

該死的你三元運算符,你是漂亮的代碼風格... – Grammin

+0

@Grammin,有些話要說的簡潔思想,特別是當你堅持不斷重複相同的代碼。我可以將'rotateIt == Rotate.Clockwise'保存爲'bool'並使用它,但這並沒有多大的改進。 – Blindy

+0

我認爲有一種方法可以進一步簡化。 – maclunian

0
case North: 
{ 
    if(rotateIt == Rotate.Clockwise) 
    facing = Face.EAST 
    else 
    facing = Face.WEST 
    break; 
} 

等等...

0

您正在啓動的罰款。這裏是你對枚舉操作做一個更完整的版本:

public void RotateIt(Rotate toRotate, Face facing) { 

switch (facing) { 
    case North: 
     // Include code to rotate from north 
     break; 
    case West: 
     // Include code to rotate from west 
     break; 
    case East: 
     // Include code to rotate from east 
     break; 
    default: // South 
     // Include code to rotate from south 
     break; 
} 

} 

當然,這個代碼可以優化,但它給你如何在switch報表處理enums想法。

1

另一種選擇是使用枚舉來完成這項工作。

enum Face { 
    North, East, South, West; // must be clockwise order. 
} 

enum Rotate { 
    private static final Face[] FACES = Face.values(); 
    Clockwise { 
     public Face rotate(Face face) { 
      return FACES[(ordinal()+1)%FACES.length]; 
     } 
    }, 
    Anticlockwise { 
     public Face rotate(Face face) { 
      return FACES[(ordinal()+FACES.length-1)%FACES.length]; 
     } 
    } 
    public abstract Face rotate(Face face); 
}; 

facing = rotateIt.rotate(facing); 
+0

IMO依靠'oridinal'幾乎總是一個不錯的選擇。我寧願讓面孔被賦予數字權重。另外,你的'rotate'實現仍然有'abstract'關鍵字。但絕對是比這裏發佈的+1更好的解決方案。 –

+0

@Sanjay,感謝您的評論,我編輯了我的答案。 –

2

我將實現旋轉,面部朝向的功能:

enum RotationDirection { Clockwise, CounterClockwise }; 
enum Face { 
    East, North, West, South ; 

    Face rotate(RotationDirection direction) { 
     int tick = (direction == RotationDirection.Clockwise)?-1:1; 
     int index = this.ordinal()+tick ; 
     int length = Face.values().length-1; 
     if (index <0) index = length; 
     if (index >length) index = 0; 
     return Face.values()[index]; 
    } 

然後,你可以做這樣的事情:

Face face = Face.North; 
face.rotate(RotationDirection.Clockwise); // East 
face.rotate(RotationDirection.CounterClockwise); //West 

這段代碼利用了很少使用的「序數'Enums的屬性。因此它要求這些值按照邏輯轉折順序例如(東,北,西,南)