处理这种情况的最佳(最紧凑)方法是什么:方法调用的一个或多个参数取决于某些条件,而其余参数是相同的?
例如——你想
DeathRay mynewWpn = new DeathRay(particle.proton, chassisColor.BLACK, oem.ACME)
Run Code Online (Sandbox Code Playgroud)
如果
enemy_composition == nature.ANTIMATTER
Run Code Online (Sandbox Code Playgroud)
但
DeathRay mynewWpn = new DeathRay(particle.anti-proton, chassisColor.BLACK, oem.ACME)
Run Code Online (Sandbox Code Playgroud)
如果
enemy_composition == nature.MATTER
Run Code Online (Sandbox Code Playgroud)
显然你可以,if-else但是当有很多参数或多个条件参数时,它看起来不必要地长。我也这样做了,if-else预先创建了一个参数,然后调用了该方法。同样,这似乎有点笨拙。是否有某种类似于 Excel if 语句的内联语法?
你可以做
new DeathRay(enemy_composition == nature.ANTIMATTER ? particle.proton : particle.anti-proton, chassisColor.BLACK, oem.ACME)
Run Code Online (Sandbox Code Playgroud)
……但我想我们都同意这很可怕。它还假设只有两种粒子。
这里有一些更好的选择。
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);
Run Code Online (Sandbox Code Playgroud)
enum 方法:
向您的enum, 中添加一个方法Nature。
public enum Nature
{
MATTER
{
public Particle getCounterWeapon()
{
return Particle.ANTIPROTON;
}
},
ANTIMATTER
{
public Particle getCounterWeapon()
{
return Particle.PROTON;
}
};
public abstract Particle getCounterWeapon();
}
Run Code Online (Sandbox Code Playgroud)
然后使用它。
DeathRay mynewWpn = new DeathRay(enemy_composition.getCounterWeapon(), chassisColor.BLACK, oem.ACME);
Run Code Online (Sandbox Code Playgroud)
Map:
particle type = counterWeapons.get(enemy_composition);
DeathRay mynewWpn = new DeathRay(type, chassisColor.BLACK, oem.ACME);
Run Code Online (Sandbox Code Playgroud)