处理这种情况的最佳(最紧凑)方法是什么: 方法调用的一个或多个参数取决于某些条件,而其余参数是相同的吗?
例如 - 你想要
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 :(得分: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
方法:
向enum
,Nature
添加方法。
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 :(得分: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
,它具有最低的运算符优先级,但通常会添加括号以避免混淆。
答案 2 :(得分:2)
如果enemy_composition
只能是nature.MATTER
或nature.ANTIMATTER
,那么您可以使用ternery operator:
DeathRay mynewWpn = new DeathRay(enemy_composition == nature.MATTER ? particle.anti-proton : particle.proton, chassisColor.BLACK, oem.ACME)
答案 3 :(得分:2)
如何重新设计一些课程?
在Nature类中,编写一些方法,如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'。相反,敌人本身“告诉”你应该使用什么武器来摧毁它们。
答案 4 :(得分:1)
您可以使用MAP 和命令模式来避免if-else
。
例如
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三元运算符。