用于条件参数的Compact Java语法?

时间:2010-08-26 04:26:11

标签: java syntax

处理这种情况的最佳(最紧凑)方法是什么: 方法调用的一个或多个参数取决于某些条件,而其余参数是相同的吗?

例如 - 你想要

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语句的内联语法?

5 个答案:

答案 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方法:

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 :(得分: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.MATTERnature.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三元运算符。