Вы можете вызывать разные методы с одной изменяющейся переменной в Java?

Например:

public class Game{ 
  String level;

  public void update(){
    update+"level"(); //calls diff. method depending on variable
  }

  public static void setLevel(String lv){
  level = lv;
  }

  private updateLevelOne(){
  .....
  }

  private updateLevelTwo(){
  .....
  }      
}

public class Level{......
      Game.setLevel(One);
}

Я знаю, что главное утверждение не сработает. Но мне было интересно, можно ли сделать вызов таким образом, чтобы мне не пришлось использовать оператор if/switch и перейти непосредственно к методу.

2 ответа

Решение

Либо используйте оператор switch, либо объекты:

Смена оператора:

public class Game {

    private int level;

    public void update() {
        switch(level) {
            case 1:
                updateLevelOne();
                break;
            case 2:
                updateLevelTwo();
                break;
        }
    }

    public static void setLevel(int lv) {
        level = lv;
    }

    private updateLevelOne() {
        .....
    }

    private updateLevelTwo() {
        .....
    }
}

В качестве альтернативы, сделайте ваши уровни объектами:

public class Game {

    private Level[] levels;
    private int currentLevel;

    public Game() {
        levels = new Level[2]
        levels[0] = new Level();
        levels[1] = new Level();
        currentLevel = 0;
    }

    public void update() {
        levels[currentLevel].update();
    }

    public static void setLevel(int newLevel) {
        currentLevel = newLevel;
    }
}

public class Level {

    public Level() {

    }

    public void update() {

    }
}

Объекты предпочтительнее, но вы можете пойти в любом направлении. Вы также можете пойти с reflection пакет, но это худшая идея, которая будет сложнее понять.

Нет, невозможно динамически создавать имена методов, как это.

Вы должны посмотреть шаблон Стратегии. Это означает, что вы устанавливаете некоторый интерфейс уровня как поле в вашем классе. Все ваши разные уровни должны реализовывать этот интерфейс, и каждый должен реализовывать некоторый метод обновления. Во время выполнения вы можете установить это поле с точной реализацией, которая вам нужна в то время, и вы можете вызвать update() для него. Это делегирует к необходимой реализации.

Другие вопросы по тегам