2010-08-26 52 views
2

什麼是最好的(最緊湊)的方式來處理這種情況: 方法調用的一個或多個參數取決於某些條件,而其餘參數是相同的?條件參數的緊湊Java語法?

對於example--要

DeathRay mynewWpn = new DeathRay(particle.proton, chassisColor.BLACK, oem.ACME) 

如果

enemy_composition == nature.ANTIMATTER 

DeathRay mynewWpn = new DeathRay(particle.anti-proton, chassisColor.BLACK, oem.ACME) 

如果

enemy_composition == nature.MATTER 

顯然你可以if-else,但是當有很多參數或多個條件參數時,它看起來不必要的長。我也已經做了這個事先創建了一個參數if-else,然後調用該方法。再次,這似乎有點笨重。是否有某種類似於Excel if語句的內聯語法?

+0

'Excel if-statement'是什麼? – 2010-08-26 04:31:25

回答

4

你可以做

new DeathRay(enemy_composition == nature.ANTIMATTER ? particle.proton : particle.anti-proton, chassisColor.BLACK, oem.ACME) 

…但我認爲我們都可以認同這很可怕。它也假定只有兩種粒子。

這裏有一些更好的選擇。

switch

particle type; 
switch (enemy_composition) { /* Assuming "nature" is an enum. */ 
    case ANTIMATTER : 
    type = particle.proton; 
    break; 
    case MATTER : 
    type = particle.antiproton; 
    break; 
} 
DeathRay mynewWpn = new DeathRay(type, chassisColor.BLACK, oem.ACME); 

enum方法:

添加一個方法你enumNature

public enum Nature 
{ 

    MATTER 
    { 
    public Particle getCounterWeapon() 
    { 
     return Particle.ANTIPROTON; 
    } 
    }, 
    ANTIMATTER 
    { 
    public Particle getCounterWeapon() 
    { 
     return Particle.PROTON; 
    } 
    }; 

    public abstract Particle getCounterWeapon(); 

} 

然後使用它。

DeathRay mynewWpn = new DeathRay(enemy_composition.getCounterWeapon(), chassisColor.BLACK, oem.ACME); 

Map

particle type = counterWeapons.get(enemy_composition); 
DeathRay mynewWpn = new DeathRay(type, chassisColor.BLACK, oem.ACME); 
+1

將參數傳遞給枚舉構造函數可能會更簡單,而不是定義3次相同的方法。但無論如何goog答案,+1 – 2010-08-26 04:56:16

+0

是的,在這種情況下,它會。只是想展示如何爲每個枚舉實例編寫完全不同的方法。 – erickson 2010-08-26 16:08:45

1

您可以使用MAP 和命令模式 來避免if-else

對於eexample

Map<EnemyCompositionEnum,DeathRay> weapons = new HashMap<EnemyCompositionEnum,DeathRay>(); 

weapons.put(EnemyCompositionEnum.ANTIMATTER, new DeathRay(particle.proton,BLACK,oem.ACME)); 
weapons.put(EnemyCompositionEnum.MATTER, new DeathRay(particle.anti-proton,BLACK,oem.ACME)); 

,然後用它

DeathRay weapon = weapons.get(enemy.composition); 

更新

好吧,我才意識到什麼通過閱讀其他的答案的Excel三元運算符。

+0

我喜歡它,雖然這可能是一個過度殺傷比較:?對於這個簡單的例子,我可以看到很多情況下,這將派上用場。我不知道你可以把這些東西放在地圖的值域中。謝謝 – Pete 2010-08-26 04:45:03

+0

@Pete小心,?:是「Elvis」操作符,可在Groovy和Spring EL中使用。你可能在談論三元運算符a? b:c。 http://groovy.codehaus.org/Operators – 2010-08-26 05:02:01

+0

在Java環境中,?:是一種完全合理的方式來引用三元運算符。 – 2010-08-26 05:34:40

2

是的,這就是所謂的三元運算符?:

DeathRay mynewWpn = new DeathRay(
    enemy_composition == nature.ANTIMATTER ? particle.proton : particle.anti_proton, 
    chassisColor.BLACK, oem.ACME); 

的語法是condition ? value_if_true : value_if_false,它具有最低的運算符優先級,但括號往往添加,以避免混淆。

+0

我發現通常會添加括號來表示混淆,而不是避免它。 – 2010-08-26 05:32:52

2

如果enemy_composition只能是nature.MATTERnature.ANTIMATTER那麼你可以使用一個ternery operator

DeathRay mynewWpn = new DeathRay(enemy_composition == nature.MATTER ? particle.anti-proton : particle.proton, chassisColor.BLACK, oem.ACME) 
2

如何重新設計一些類?

在自然類中,編寫一些像getDestroyer()這樣的方法。

abstract class Enemy{ 
    abstract Weapon getDestroyer(); 
} 

然後在像水泥類:

class MatterEnemy extends Enemy{ 
    Weapon getDestroyer(){return new DeathRay(antiproton, blabla);} 
} 

你實現這樣的方法。所以你的主要類將是:

public static void main(String... args){ 
    Enemy enemy = new MatterEnemy(); 
    Weapon weapon = enemy.getDestroyer(); 
} 

這樣你可以避免條件'ifs'。相反,敵人本身'告訴'你應該用什麼武器來摧毀它們。