2011-06-24 73 views
4

您可以在Java中的switch语句中包含多个变量吗?switch语句中变量的数量 - Java

enum Facing { North, South, East, West } 

enum Forward { Right, Left } 

Forward forward; 

Facing facing; 

Integer myNumber; 

所以它看起来像这样?如果是的话我将如何去实现

switch (facing, forward) { 
    case North, Right : facing 1 = East 
} 

我知道这是错误的,但不知道这种技术是否会工作,我将如何实现它?

+0

的swicth语句可以切换仅primitve类型和enums.So你为什么不改变所有的枚举到一个单一的数字,比切换呢? – 2011-06-24 20:17:49

回答

4

你可以这样做:(例如转90 clocwise)

switch(facing) 
{ 
    case North: 
     switch(forward) 
     { 
       case Right: // blah blah 
       break; 
     } 
    break; 
} 
+0

这是做到这一点的方法。你甚至可以删除一些新行来将代码全部放在一行上,使其更具可读性和简洁性。如果使用这种解决方案,不要忘记在所有正确的地方放置'break',因为这可能会随着所有排列而快速失控。 –

+0

是的,但是肯定的是if语句在这里看起来更好更简单吗? 'if(facing == North && forward == Right){...} else if(...)' –

0

切实你模拟一组状态转换的,当你在一个特定的状态是(例如,面对北)某些行动导致一个新的状态(面向东)

你可以用一系列嵌套的switch语句或类似的东西建模这样的东西。我认为你可能会尽最大努力将状态建模为显式类,这些类可能来自定义动作的抽象基类。

我怀疑如果你的状态或行为变得稍微复杂一些,你会发现你需要这些类。

9

Eng.Fouad给出了一个方法。

另一个altenative可能会创建一个更复杂的面对枚举这样的:

enum Facing { 
    North { 
    Facing right() { return East; } 
    Facing left() { return West; } 
    }, 
    East { 
    Facing right() { return South; } 
    Facing left() { return North; } 
    }, 
    South { 
    Facing right() { return West; } 
    Facing left() { return East; } 
    }, 
    West { 
    Facing right() { return North; } 
    Facing left() { return South; } 
    }; 
    abstract Facing right(); 
    abstract Facing left(); 
} 

这样的结构也可以很容易地链接,让你可以写这样的通用反向程序:

Facing reverse(Facing facing) { return facing.right().right(); } 
2

这似乎是它属于面向:

enum Facing { 

    North, East, South, West; 

    public Facing turn(Forward f) { 
     return values()[(ordinal() + (f == Forward.Right ? 1 : 3)) % 4]; 
    } 
} 
2

与开始JDK 7,你可以用一根绳子开关模拟这个:

Facing facing = Facing.North; 
Forward forward = Forward.Right; 

String facingForward = facing + "-" + forward; 
switch(facingForward){ 
    case "North-Right": return East; 
    .. 
}