条件参数的压缩Java语法?

条件参数的压缩Java语法?,java,syntax,Java,Syntax,处理这种情况的最佳(最紧凑)方法是什么: 方法调用的一个或多个参数取决于某些条件,而其余参数是相同的 例如,你想 DeathRay mynewWpn = new DeathRay(particle.proton, chassisColor.BLACK, oem.ACME) 如果 但是 如果 显然,您可以if-else,但当有许多参数或多个条件参数时,它看起来不必要地长。我还预先创建了一个带有if-else的参数,然后调用该方法。同样,这似乎有点笨重。是否存在类似于Excel if语句的某种内联

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

例如,你想

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

但是

如果

显然,您可以
if-else
,但当有许多参数或多个条件参数时,它看起来不必要地长。我还预先创建了一个带有
if-else
的参数,然后调用该方法。同样,这似乎有点笨重。是否存在类似于Excel if语句的某种内联语法?

您可以使用映射和命令模式来避免使用
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));
更新
好的,通过阅读其他答案,我才意识到什么是Excel三元运算符

是的,它被称为三元运算符
?:

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

语法是
条件?value\u if\u true:value\u if\u false
,它具有最低的运算符优先级,但通常会添加括号以避免混淆。

如果
敌人的组成
只能是
自然。物质
自然。反物质
,则可以使用:

你能行

new DeathRay(enemy_composition == nature.ANTIMATTER ? particle.proton : particle.anti-proton, chassisColor.BLACK, oem.ACME)
…但我想我们都同意这很可怕。它还假设只有两种粒子

这里有一些更好的选择

开关

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

将方法添加到
枚举
性质

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);
地图

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

重新设计一些类怎么样

在Nature类中,编写一些方法,如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();
}

这样可以避免有条件的“如果”。相反,敌人自己“告诉”你应该使用什么武器来摧毁他们。

什么是“Excel if statement”?我喜欢它,尽管它与a相比可能有点杀伤力:对于这个简单的例子,我可以看到很多情况下这会派上用场。我不知道你可以把这样的东西放在地图的值字段中。thanks@Pete小心,?:是“Elvis”操作符,在Groovy和Spring EL中可用。你可能在说三元运算符a?b:c。在Java上下文中,“:是引用三元运算符的一种非常合理的方式。只将参数传递到枚举构造函数中,而不是三次定义相同的方法,可能会更容易。但谷歌回答说,+1是的,在这种情况下是这样的。我只是想展示如何为每个枚举实例编写完全不同的方法。我发现经常添加括号来表示混淆,而不是避免混淆。
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);
particle type = counterWeapons.get(enemy_composition);
DeathRay mynewWpn = new DeathRay(type, chassisColor.BLACK, oem.ACME);
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();
}