条件参数的压缩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();
}