Компактный синтаксис Java для условных аргументов? - PullRequest
2 голосов
/ 26 августа 2010

Какой самый лучший (самый компактный) способ передать эту ситуацию: Один или несколько аргументов вызова метода зависят от некоторого условия, а остальные аргументы идентичны?

Например, вы хотите

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 и затем вызвав метод. Опять же, это кажется неуклюжим. Есть ли какой-то встроенный синтаксис, похожий на if-оператор Excel?

Ответы [ 5 ]

4 голосов
/ 26 августа 2010

Вы можете сделать

new DeathRay(enemy_composition == nature.ANTIMATTER ? particle.proton : particle.anti-proton, chassisColor.BLACK, oem.ACME)

& hellip; но я думаю, что мы все можем согласиться, что это отвратительно. Также предполагается, что существует только два вида частиц.

Вот несколько лучших альтернатив.

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);
2 голосов
/ 26 августа 2010

Как насчет редизайна какого-то класса?

В классе 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();
}

Таким образом, вы можете избежать условных «если». Вместо этого сам Враг «говорит» вам, какое оружие следует использовать для их уничтожения.

2 голосов
/ 26 августа 2010

Да, это называется троичным оператором ?:

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 голосов
/ 26 августа 2010

Если enemy_composition может быть только nature.MATTER или nature.ANTIMATTER, тогда вы можете использовать оператор ternery :

DeathRay mynewWpn = new DeathRay(enemy_composition == nature.MATTER ? particle.anti-proton : particle.proton, chassisColor.BLACK, oem.ACME)
1 голос
/ 26 августа 2010

Вы можете использовать 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);

update

Хорошо, я только что понял, что такое троичный оператор Excel, прочитав другие ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...